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)