C++ Primer 笔记 第三章

来源:互联网 发布:矩阵特征分解证明 编辑:程序博客网 时间:2024/06/06 04:34
第三章

1、几个标准库类类型
     string
     构造函数有4种:
  •      string s1;  //默认,s1=NULL
  •      string s2(s1);  //s2初始化为s1的一个副本
  •      string s3("value");
  •      string s4(10,'a');  //s4初始化为"aaaaaaaaaa"
    ****cin>>s1 和 getline(cin, s1) 的区别
               前者忽略空格,后者不忽略空格,并将从cin中取出整行,一次性送给s1,两者都是Ctrl+z退出while循环.
     ****string对象的操作
  •                s.empty()
  •                s.size()    //返回string的长度
  •                s[n]
  •                s1+s2
  •                v1==v2
  •                !=,<,<=...
     ****string::size_type类型
               注意s.size()返回的不是int类型,而是相当与unsigned的string::size_type类型,所以接这个函数的返回值不能用int,要用string::size_type,如果不这样,就可能会有数据溢出的问题(int范围是unsigned范围的一半),即:
               int size=s.size();  //error,convert from unsigned to int
               string::size_type size=s.size();  //ok from unsigned to unsigned
2、string对象中字符的处理(有众多函数,如islower()。。。见P77)
 ****实例:
                //去掉字符串中的标点符号
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(){
     string s("Hellow Worssld !QQ!!");
     string res;
     for(string::size_type i=0; i!=s.size(); ++i){
          if(!ispunct(s[i])){
               res+=s[i];              
          }           
     }
     cout<<res<<endl;
}、
3、vector
  • vector不是一个数据类型,而是一个模板类,指定数据类型后才可以成为一个数据类型。
  • vector是一个可动态增长的数组
  • vector的size()函数返回一个vector<T>::size_type类型(即unsigned的值,与string::size_type类似)
  • vector[index]操作只能获取元素,不能给元素赋值,赋值应该用v.push_back(t)函数
  • 实例
  • //将输入的单词转出大写的
  • #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main(){
         string s("Hellow Worssld !QQ!!");
         string res;
         for(string::size_type i=0; i!=s.size(); ++i){
              if(!ispunct(s[i])){
                   res+=s[i];              
              }           
         }
         cout<<res<<endl;
    }
4、缓冲区溢出是指对不存在的元素进行下标操作的结果。
5、iterator迭代器
  •      迭代器是一种特殊的数据类型,能够遍历容器内的元素,并访问这些元素的值。 
  •      标准库为每一种容器都定义了一种迭代器类型。
  •      每个容器都定义了一对名为begin()和end()的函数,用于返回迭代器:
  •           例如:
  •                vector<int>::iterator iter=ivec.bin();  //指向vector<int>类型元素的迭代器iter被初始化为指向第一个元素
  •      end()返回的是最后一个元素的下一个位置。
  •      实例:#include <iostream>
#include <vector>
using namespace std;
int main(){
     vector<int> intVec(10,1);
     cout<<"修改前"<<endl;
     for(vector<int>::iterator iter=intVec.begin();iter!=intVec.end();++iter){  //注意这里,iterator是属于vector<int>这种类型,而不是属于intVec对象的
          cout<<*iter<<endl;
          }
     for(vector<int>::iterator iter=intVec.begin();iter!=intVec.end();++iter){
          *iter=(*iter)*2;
     }
     cout<<"修改后"<<endl;
     for(vector<int>::iterator iter=intVec.begin();iter!=intVec.end();++iter){
          cout<<*iter<<endl;
     }
}
  •      区别 vector<int>::const_iterator 和 const vector<int>::iterator
          前者表明该iterator是指向const元素的,即不能通过*iter改变元素的值,即不能改变元素;
          而后者是指该iterator是const的,不能改变iterator。
6、标准库bitset类型
  •      bitset类型对象的区别仅在于其长度而不在于其类型即
          bitset<32> bitvec;  //32bits, all zero
  •      string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的字符)用来初始化bitset对象的低阶位(即下标为0的位)