C++的第三章主要介绍了一下标准库和最重要的标准库类型:string和vector

 

当我们使用某个命名空间中的名字,一般都要通过std::cout这样的写法来引用以避免重名,但是如果我们觉得麻烦的话也可以通过using声明:

  1. using namespace std; 
  2. using std::cout; 

但是有一种情况必须总是使用完全限定的标准库名字:在头文件中。理由是头文件中的内容会被预处理器复制到程序中。如果在头文件中加上using声明就相当于在整个程序中加上了这个声明。

 

标准库String类型


1.String对象的定义和初始化

  1. string s1;         //默认构造函数为空串     
  2. string s2(s1);     //初始化s2为s1的一个副本,修改s2不会影响s1   
  3. string s3 = "value";  
  4. string s3("value");  //将s3初始化为一个字符串字面值副本  
  5. string s4(n, 'c');   //将s4初始化为字符c的n个副本     

当然,我们也可以通过cin来获取string的值,对于string类型的输入操作符有以下规定:

a.读取并忽略开头所有的空白字符

b.读取字符直至再次遇到空白字符,读取终止

 

那么如何读取多个包含空格的字符串呢?getline

这个函数接受两个参数:一个输入流对象和一个string对象,getline从输入流的下一行读取,并保存读取的内容到string中,不包括换行符。和输入操作符不一样的地方在于getline不会忽略开头的换行符,只要遇到换行符哪怕是第一个读取也会结束,string参数就是空。

 

2.string对象的操作

  1. s.empty()  //如果s为空串则返回true,否则返回false 
  2. s.size()   //获取s的长度 
  3. s[n]       //s的第几个字符,从0开始计数 
  4. s1 + s2    //把s1和s2连接起来返回新的字符 
  5. s1 = s2    //把s1内容替换成s2的副本 
  6. v1 == v2   //比较是否相等 
  7. !=, <, <=  //就是惯有含义 

string::size_type类型:

string类类型和许多其他库类型都定义了一些配套类型。通过这些配套类型,库类型的使用就能与机器无关,size_type类型定义为与unsigned型具有相同含义,而且可以满足足够大能够存储任意string对象的长度。为了避免溢出,保存一个string对象size最安全的方法就是使用标准库类型string::size_type

  1. for(string::size_type i=0; i<s.size(); i++)

 

关系操作符的比较规则:

a.如果两个对象长度不同,且短的对象与长的对象前面部分匹配,则短的对象小于长的对象

b.如果两个对象自负不同,则比较第一个不匹配的字符

 

我们在进行字符串字面值连接的时候可以任意匹配相加:

  1. string s2 = s1 + " " + "world";

 

标准库vector类型

我们把vector称作容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的

vector是一个类末模板(class template),使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型

  1. vector<int> ivec; 
  2. vector(sales_item) sales_vec; 

 

1.vector对象的定义和初始化

套路基本一样

  1. vector<T> v1;  //默认构造函数v1为空 
  2. vector<T> v2(v1); 
  3. vector<T> v3(n,i); 
  4. vector<T> v4(n); 

 值初始化的问题:如果保存内置类型(int)的元素,用0值初始化,如果是有构造函数的类类型(string),就用类的构造函数来进行初始化

 

2.vector对象的操作

  1. v.empty()            //判断是否为空 
  2. v.size()                //返回元素个数 
  3. v.push_back(t)   //在末尾添加一个值为t的元素 
  4. v[n]                    //返回位置为n的元素 
  5. v1 = v2              //将v1的元素替换成v2中元素的副本 
  6. v1 == v2           //判断是否相等 
  7. !=, <, <=           //保持惯有含义 

vector对象的size:

使用size_type的时候,必须指出该类型是哪里定义的。vector类型包括元素类型

  1. vector<int>::size_type     //ok 
  2. vector::size_type              //error 

 

3.迭代器简介

迭代器是一种检查容器内元素并遍历元素的数据类型(每种标准容器都定义了一种迭代器类型vector<int>::iterator iter)

  1. for(vector<string>::iterator iter = string_vec.begin();iter != string_vec.end(); iter++) 

当然还有一种const_iterator的类型,这种类型只能读取容器内的元素。

不要把const_iterator对象和const的iterator对象混淆了,前者是可以任意读取可以iter++,但是const vector<int>::iterator iter的话*iter可变,iter不可变。

 

标准库bitset类型

定义bitset的时候,要明确bitset含有多少位(bitset<32> bitvec;)

1.bitset对象的定义和初始化

 

  1. bitset<n> b;           //b有n位,都是0 
  2. bitset<n> b(u);        //b是unsigned long型u的一个副本 
  3. bitset<n> b(s);        //b是string对象s中含有的位串的副本 
  4. bitset<n> b(s, pos, n);  //b是s中从位置pos开始的n个位的副本 

 

同样,bitset对象上一样有很多的操作,这里就不一一例举了