今天的笔记是第一部分第三章,主要讲的常见标准库和容器,对这些容器熟悉后在写算法题效率会高不少。
第三章 字符串、向量和数组
第二章介绍的内置类型是由C++语言直接定义的。这些类型,比如数字和字符,体现了大多数计算机硬件本身具备的能力。标准库定义了另外一组具有更高级性质的类型,它们尚未直接实现到计算机硬件中
3.1 命名空间using声明
using namesapce::name
头文件不应包含using声明
位于头文件的代码一般来说不应该使用using
声明。这是因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using
声明,那么使用了该头文件的文件就会有这个声明。对于某些程序来说,由于不经意间包含了一些名字,反而可能产生始料未及的名字冲突。
3.2 标准库类型string
标准库类型string表示可变长的字符序列
#include<string>
using std::string;
3.2.1 定义和初始化string对象
string s1; // 默认初始化,s1是一个空串
string s2(s1); // s2是s1的副本
string s2 = s1; // 等价于s2(s1)
string s3("value"); // s3是字面值"value"的副本,除了字面值最后的那个空字符除外
string s3 = "value"; // 等价于s3("value")
string s4(n, 'c'); // 将s4初始化为连续n个字符c组成的串
直接初始化和拷贝初始化
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化(copy initialization),编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化(direct initialization)。
当初始值只有一个时,使用直接初始化或拷贝初始化都行。如果初始化的值有多个,一般来说只能使用直接初始化的方式。
string s7(10, 'c'); // 直接初始化
3.2.2 string对象上的操作
os << s // 将s写到输出流os中,返回os
is >> s // 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is, s) // 从is中读取一行赋给s,返回is
s.empty() // s为空返回true
s.size() // 返回s中字符的个数
s[n] // 返回s中第n个字符的引用
s1+s2 // 拼接s1、s2
s1==s2&s1!=s2 // s1和s2的比较,大小写敏感
<,<=,>,>=
使用getline读取一整行
getline(istream, object)
getline
只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。
string::size_type类型
如果一条表达式中已经有了size()
函数就不要再使用int了,这样可以避免混用int
和unsigned
可能带来的问题。
字面值和string对象相加
当把string
对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少一个是string
。
因为某些历史原因,也为了与C兼容,所以C++语言中的字符串字面值并不是标准库类型string的对象。
3.2.3 处理string对象中的字符
cctype头文件中的函数