1.顺序容器(sequence container) --拥有由单一类型元素组成的一个有序集合
list, vector, deque
2.关联容器(associative container) --支持查询一个元素是否存在, 并且可以有效地获取元素
map, set, multimap, multiset
3.容器的容量 --在容器下一次需要增长自己之前能够被加入到容器中的元素的总数(容量只与连续存储的容器相关:vector, deque, string. 而list不要求
容量)
4.capacity()操作 --求一个容器的容量
5.容器的长度 --容器当前拥有元素的个数
6.size()操作 --求一个容器的长度
7.数据类型越复杂, vector的效率就越低
8.reserve()操作 --允许程序员将容器的容量设置成一个现实指定的值
9.迭代器(iterator) --提供了一种一般化的方法, 对顺序或关联容器类型中的每个元素进行连续访问
10.每个容器类型都提供了一个begin()和一个end()成员函数
11.begin()返回一个iterator, 指向容器的第一个元素
12.end()返回一个iterator, 指向容器的末元素的下一个位置
13.出了iterator类型, 每个容器还定义了一个const iterator类型, 对于遍历const容器是必需的
14.iterator算术论算只适用于vector或deque, 而不适用与list, 因为ielist的元素在内存中不是连续存储的
15.string.find_first_of()查找与被搜索字符串中任意一个字符相匹配的第一次出现, 并返回它的索引位置
16.string.substr()生成string对象的字串的一个拷贝
17.string.rfind()查找最后的指定字串出现的索引
18.string.find_first_not_of()查找第一个不与要搜索字符串的任意字符相匹配的字符
19.string.find_last_of()查找字符串中的"与搜索字符串任意元素相匹配"的最后一个字符
20.string.find_last_not_of()查找字符串中的"与搜索字符串任意字符全不匹配"的最后一个字符
21.string.erase(pos, num)操作去掉字符串中的指定串, pos表示位置, num表示去掉的长度
22.<locale>ctype类, 封转了标准c库函数的功能及一组非成员函数
23.string.compare(pos, num, str); 比较pos位置的后面num个字符是否为str
24.string.insert(pos, newstring); pos表示要插入的位置, newstring表示要插入的字符串
25.string.assign(); 字符串拷贝
26.string.append(); 字符串拼接
27.string.swap(); 交换两个字符串
28.string.at(); 对字符的下标索引操作, 有对索引值范围检测, 下标越界时抛出out_of_range异常
try {
char ch = st.at(index);
} catch(std::out_of_range) { ... }
29.string.replace(pos, num, newstring); 用newstring代替pos后面num个字符子串
30.map 也叫关联数组(associative array) 键/值对 key/value
键用来索引map, 值用作存储和检索的数据
map对象定义, 至少要指明键和值的类型, 如:
map<string, int> word_count;
31.map的数据录入
map<string, string> str_str;
str_str[string("one")] = string("1"); //这种效率比较低
str_str.insert(
map<string, string>::value_type("two", "2")
); //这种效率高
32.查找并获取map中的元素
最简单的方法:
value = mapObj[key];
但这样有个问题, 如果不存在key这个键, mapObj就会插入key键, 并把对应的value值为默认值, 这样得到的value是无效的
所以, 应该这样写
if(mapObj.count(key))
value = mapObj[key];
或者这样:
map<keyType, valueType>::iterator iter = mapObj.find(key);
if(iter != mapObj.end())
value = mapObj[key];
33.从map中删除元素
erase操作
mapObj.erase(key);
还有两种重载方式, 详见文档
mapObj.clear(); 清空map对象所有值
34.set对象插入元素
#include <set>
set<setType> setObj;
setObj.insert(key);
35.set对象查找元素
setObj.count(key); //1有, 0没有
setObj.find(key); iter为setObj.end()表示没有
36.multiset和multimap允许要被存储的键出现多次
对于multiset和multimap的迭代策略是联合使用find返回的iterator和count返回的值:
count = mulsetObj.count();
multiset<type>::iterator iter;
iter = mulsetObj.find(key);
for(int i = 0; i < count; ++i, ++iter)
do_something(*iter);
另一种方法是使用equal_range()返回的iterator值
如果这个值存在, 则第一个iterator指向该值的第一个实例, 且第二个iterator指向这个值的最后一个实例的下一个位置:
switch(mulmapObj.count) {
case 0: break; //不存在
case 1: //只有一项, 用普通的find操作
multimap<keyType, valueType>::iterator iter;
iter = mulmapObj.find(key);
do_something(*iter);
break;
default: //有许多项
typedef multimap<keyType, valueType>::iterator it;
pair<it, it>pos;
pos = mulmapObj.equal_range(key);
for(; pos.first != pos.second; pos.first++)
do_somethine(*pos.first);
}
//对应的, 删除的话用mulmapObj.erase(pos.first, pos.second);
//不支持下标操作是访问multimap元素的一个限制:
mulmapObj[key]; //错误
37.栈容器(stack container)支持的操作 //头文件<stack>
empty()
size()
pop()
top()
push(item)
38.栈类型被称为容器适配器(container adapter)
39.缺省情况下, 栈用容器类型deque实现, 改变这个缺省值可以这样:
stack<type, list<type>> stackObj; //改成用容器类型list实现
//一般是定义一个指针栈
class CTest;
stack<CTest*> ctestStack;
40.标准库提供了两种风格的队列: queue(队列), priority_queue(优先级队列)
头文件 <queue>
41.queue和priority_queue操作
empty()
size()
pos()
front() //只能用在一般队列
back() //只能用在一般队列
top() //只能用在优先级队列
push(item)