C++的第三章主要介绍了一下标准库和最重要的标准库类型:string和vector
当我们使用某个命名空间中的名字,一般都要通过std::cout这样的写法来引用以避免重名,但是如果我们觉得麻烦的话也可以通过using声明:
- using namespace std;
- using std::cout;
但是有一种情况必须总是使用完全限定的标准库名字:在头文件中。理由是头文件中的内容会被预处理器复制到程序中。如果在头文件中加上using声明就相当于在整个程序中加上了这个声明。
标准库String类型
1.String对象的定义和初始化
- string s1; //默认构造函数为空串
- string s2(s1); //初始化s2为s1的一个副本,修改s2不会影响s1
- string s3 = "value";
- string s3("value"); //将s3初始化为一个字符串字面值副本
- string s4(n, 'c'); //将s4初始化为字符c的n个副本
当然,我们也可以通过cin来获取string的值,对于string类型的输入操作符有以下规定:
a.读取并忽略开头所有的空白字符
b.读取字符直至再次遇到空白字符,读取终止
那么如何读取多个包含空格的字符串呢?getline
这个函数接受两个参数:一个输入流对象和一个string对象,getline从输入流的下一行读取,并保存读取的内容到string中,不包括换行符。和输入操作符不一样的地方在于getline不会忽略开头的换行符,只要遇到换行符哪怕是第一个读取也会结束,string参数就是空。
2.string对象的操作
- s.empty() //如果s为空串则返回true,否则返回false
- s.size() //获取s的长度
- s[n] //s的第几个字符,从0开始计数
- s1 + s2 //把s1和s2连接起来返回新的字符
- s1 = s2 //把s1内容替换成s2的副本
- v1 == v2 //比较是否相等
- !=, <, <= //就是惯有含义
string::size_type类型:
string类类型和许多其他库类型都定义了一些配套类型。通过这些配套类型,库类型的使用就能与机器无关,size_type类型定义为与unsigned型具有相同含义,而且可以满足足够大能够存储任意string对象的长度。为了避免溢出,保存一个string对象size最安全的方法就是使用标准库类型string::size_type
- for(string::size_type i=0; i<s.size(); i++)
关系操作符的比较规则:
a.如果两个对象长度不同,且短的对象与长的对象前面部分匹配,则短的对象小于长的对象
b.如果两个对象自负不同,则比较第一个不匹配的字符
我们在进行字符串字面值连接的时候可以任意匹配相加:
- string s2 = s1 + " " + "world";
标准库vector类型
我们把vector称作容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的
vector是一个类末模板(class template),使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型
- vector<int> ivec;
- vector(sales_item) sales_vec;
1.vector对象的定义和初始化
套路基本一样
- vector<T> v1; //默认构造函数v1为空
- vector<T> v2(v1);
- vector<T> v3(n,i);
- vector<T> v4(n);
值初始化的问题:如果保存内置类型(int)的元素,用0值初始化,如果是有构造函数的类类型(string),就用类的构造函数来进行初始化
2.vector对象的操作
- v.empty() //判断是否为空
- v.size() //返回元素个数
- v.push_back(t) //在末尾添加一个值为t的元素
- v[n] //返回位置为n的元素
- v1 = v2 //将v1的元素替换成v2中元素的副本
- v1 == v2 //判断是否相等
- !=, <, <= //保持惯有含义
vector对象的size:
使用size_type的时候,必须指出该类型是哪里定义的。vector类型包括元素类型
- vector<int>::size_type //ok
- vector::size_type //error
3.迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型(每种标准容器都定义了一种迭代器类型vector<int>::iterator iter)
- 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对象的定义和初始化
- bitset<n> b; //b有n位,都是0
- bitset<n> b(u); //b是unsigned long型u的一个副本
- bitset<n> b(s); //b是string对象s中含有的位串的副本
- bitset<n> b(s, pos, n); //b是s中从位置pos开始的n个位的副本
同样,bitset对象上一样有很多的操作,这里就不一一例举了