上一篇文章主要学习的是C++的基本类型,它们是C++语言直接定义的,它们体现了计算机硬件本身具备的能力。而本篇文章将主要学习内置类型之外的标准库所定义的类型,分别是string和vector,此外还将学习用来和string与vector配套使用的类型——迭代器,其中string是可变长度的字符序列,而vector则是可变长的给定类型的序列,除此之外还将学习与上述类似的一种内置类型——数组,其也与硬件密切相关。
1. 命名空间的using声明
注意事项:
- 头文件中的代码一般来说不应该使用using声明
2. 标准库类型string
所在头文件:string
2.1 定义和初始化string对象
初始化string对象的几种方式
string s1; 默认初始化,s1是一个空串 string s2(s1); s2是s1的副本 string s2=s1; 等价于s2(s1),s2是s1的副本 string s3("value"); s3是“value”的副本,除了后面的空字符 string s3="value"; 等价于s3("value"),s3是“value”的副本 string s4(n,'c'); 把s4初始化为连续的n个字符c
直接初始化和拷贝初始化
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化。
string s5="hiya"; 拷贝初始化 string s6("hiya"); 直接初始化
2.2 string对象上的操作
注意事项:
- 执行读取操作时,string对象会自动忽略开头的空白,并从第一个真正的字符开始读起,直到下一个空白处
- getline()读取整行会保留一行中的空白符,直到碰到换行符,但最终读到的数据不保留换行符号
- size()函数不要和int型的数据一起在表达式中使用,因为size()的返回类型是unsigned类型
- string的比较操作对大小写敏感,比较的时候,如果字符都相同则比较长短,否则比较第一个不相同的字符的字典顺序
- string和字面值的相加时要注意,加号两边必须要有一个string对象,不能全是字面值
2.3 处理string对象中的字符
在头文件cctype中定义了一组函数
使用基于范围的for循环遍历字符串的每个字符
string s = "hello world!"; for (auto c : s) { cout << c << endl; }
如果需要修改字符串中的字符,则需要将循环控制变量定义为引用
string s = "hello world!"; for (auto &c : s) { c = toupper(c); } cout << s << endl;
NOTE:使用下标(索引)来访问字符串的某个字符时,一定要注意下标不能超出范围,这个时候我们一般使用decltype(s.size())来定义下标变量,这样就不会出现小于0的情况,只要控制小于size()即可。
for(decltype(s.size()) index=0; index!=s.size() && !isspace(s[index]); ++index) { s[index] = toupper(s[index]); }