头文件
- 每个容器都定义在一个头文件中,文件名和类型名相同。
string
- 读取操作:
cin >> s;
- string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止;
- 此类操作也返回运算符左侧的运算对象作为其结果;因此,多个输入输出可以连写:
cin >> s1 >> s2;
while( cin >> s );
- 读取数量未知的字符串
- 流有效则循环读取,直到遇见文件结束标记(mac文件结束符 ctrl+d)或非法输入
while( getline( cin, s ) );
- 可以保留输入时的空白符
- getline一遇到换行符就结束读取操作
- getline也返回它的流参数
size()
函数返回值类型:string::size_type
类型- string、字面值的对象相加
- 两个string对象可以直接相加:+、+=
- 当把string对象和字符字面值混在一条语句中使用时,必须确保每个+两侧运算对象至少有一个是string.
- 当把两个字面值对象直接相加时,会出错,编译器无法做到。
- C++中,(为了兼容c)字符串字面值并不是标准库类型string的对象。两者是不同的类型。
- C风格字符串:字符串字面值(空字符结束)
for(auto &c : s)
- 把循环变量定义为引用类型:改变string对象中字符的值。
- 接受
const char*
的构造函数- 当我们从一个
const char*
创建 string 时,指针指向的数组必须以空字符结尾,拷贝操作遇到空字符停止。
- 当我们从一个
- 搜索操作:
if(s.find(t) != string::npos)
- 若搜索失败,返回
string::npos
; - 初始值为 -1.
- static
- 若搜索失败,返回
迭代器
- 泛型编程:养成使用 != 和 迭代器 的习惯。
- 所有的标准库容器都定义了 == 和 !=,但是大多数都没有定义 <.
- 所有的标准库容器都定义了迭代器,但只有少数可以同时支持下标。
- 迭代器类型:
iterator
和const_iterator
;也可直接用auto
定义。
- 迭代器运算:
- 迭代器之间运算符只有 “-”,没有“+”。
- 迭代器和整数之间可“+”可“-”。
内置数组
- 内置数组大小确定,数组不能增加元素。
- 字符数组
- 可以用字符串字面值初始化字符数组。字符串字面值结尾的空字符也会被拷贝到字符数组中。
char a1[] = "c++";
// a1[]维度为4,包含空字符串
- 对于复杂的数组声明:由内而外比从右向左阅读好得多。
- 尽量使用标准库类型vector和迭代器,避免使用内置数组和指针。
- 大多数表达式中,使用数组类型的对象是使用一个指向该数组首元素的指针。
- 多维数组:实际上,就是数组的数组。
标准库array
- 与内置数组一样,array的大小也是类型的一部分。
- 与内置数组不同,array可以进行拷贝或赋值。
容器适配器
- 适配器:一种机制,使得某种事物的行为看起来像另外一种事物一样。
- 容器适配器种类
stack
:基于dequequeue
:基于dequepriority_queue
:基于vector;允许我们为队列中的元素建立优先级。
set
- 支持高效关键字查询:检查给定关键字是否在set中。
- 分类:
set
:去重且有序multiset
:未去重且有序unordered_set
:去重且无序unordered_multiset
:未去重且无序
- 迭代器
- 解引用set,关键字是const
map
- <key, value>对,关键词key类似数组下标起索引作用。
- 当从map中提取元素时,会得到一个 pair 类型的对象。
- 分类:
map
:去重且有序multimap
:未去重且有序unorder_map
:去重且无序unordered_multimap
:未去重且无序
- pair类型
make_pair(v1, v2);
- 模版类型,定义在头文件 utility 中。
- pair两个数据成员:first,second . 都是public的。
- 迭代器
- 解引用 map 得到 pair 中,first是const .