一、string类
1. 构造函数:
注:npos为字符串的最大长度;NBTS表示以空字符结尾的字符串
2. 输入:
3. 使用字符串:
(1) 可以运用关系运算符比较字符串。
(2) size() 和 length() 成员函数返回字符串的字符数。
(3) 搜索字符串或字符:
(4) capacity() 返回当前分配给字符串的内存块的大小;reverse() 可以请求内存块的最小长度。
(5) c_str() 返回一个指向C-风格字符串的指针。
二、智能指针模板类
1. 三个智能指针模板(auto_ptr、unique_ptr、shared_ptr)都定义了类似指针的对象,可将new获得的地址赋给这种对象,当指针过期时,其析构函数将使用delete释放内存。
2. 创建智能指针对象需包含头文件memory。
3. 所有智能指针都一个explicit构造函数,该构造函数将指针作为参数。
4. 当两个指针指向同一对象时:
(1) 定义赋值运算符。
(2) 建立所有权概念,使得对于特定对象只有一个智能指针可拥有它,这是用于auto_ptr和unique_ptr的策略。
(3) 创建智能更高的指针跟踪引用特定对象的智能指针数,这是shared_ptr的策略。
5. 程序试图将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许这样做,否则编译器将禁止这样做。
注:move() 函数允许将一个unique_ptr赋给另一个。
6. 使用new分配内存时,才能使用auto_ptr和shared_ptr;不使用new或new[]分配内存时,不能使用unique_ptr。
7. 选择智能指针:如果程序要使用多个指向同一个对象的指针,应选择shared_ptr;否则可使用unique_ptr或auto_ptr(前者更好)。
8. 在unique_ptr为右值时,可将其赋给shared_ptr。
三、模板类vector
1. 使用动态内存分配,可以用初始化参数指出需要多少矢量。
2. 基本方法:
(1) size():返回容器中元素数目。
(2) swap():交换两个容器内容。
(3) begin():返回一个指向容器第一个元素的迭代器。
(4) end():返回一个表示超尾的迭代器。
(5) erase():接受两个迭代器,删除量迭代器区间的元素。
(6) insert():接受三个迭代期,第一个为插入位置,第二、三为被插入区间。
四、STL(泛型编程)
1. STL函数:
(1) for_each()函数:接受三个参数,前两个是定义容器中区间的迭代期,最后一个是指向函数的指针即函数对象。该函数使被指向的函数应用于区间的每个元素,被指向的函数不能修改容器元素的值。
(2) random_shuffle()函数:接受两个指定区间的迭代器参数,并随机排列该区间的元素。
(3) sort()函数:第一个版本接受两个指定区间的迭代器参数,并按升序排列区间元素;第二个版本还接受第三个参数,该参数指定了要使用的函数指针。
(4) copy()函数:前两个为要复制范围区间的迭代器(最好是输入迭代器),最后一个为复制到的位置的迭代器(最好是输出迭代器)。该函数不能自动根据发送值调整目标容器的长度,可通过三种插入迭代器解决问题:back_insert_iterator(将元素插入到容器尾),front_insert_iterator(插入到容器头),insert_iterator(插入到指定位置前)。
注意:如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的operator<()函数。
2. 迭代器类型:
(1) 输入迭代器:输入即来自容器的信息被视为输入,基于输入迭代器的任何算法都应该是单通行的,输入迭代器是单向迭代器,可以递增不可倒退。
(2) 输出迭代器:输出指用于将信息从程序传输给容器,其只是解除引用让程序修改容器值而不能读取。
(3) 正向迭代器:只使用++运算符来遍历容器,将正向迭代器递增后仍可以对前面的迭代器值解除引用。
(4) 双向迭代器:具有正向迭代器的所有特征,且支持前缀和后缀递减运算符。
(5) 随机访问迭代器:具有双向迭代器的所有特性,且支持随机访问操作,有用于对元素进行排序的关系运算符。
总结:对于单通行、只读算法,可以使用输入迭代器;对于单通行、只写算法,可以使用输出迭代器。
3. 迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。
4. 序列容器:
(1) vector:是反转容器,在尾部添加和删除元素时间固定,但在头部或中间插入元素和删除元素复杂度为线性时间,其强调通过随机访问进行快速访问。一般默认使用这种类型。
(2) deque:双端队列,在开始位置插入和删除元素的时间是固定的。如果多数操作发生在序列的起始和结尾处,则应考虑deque。
(3) list:双向链表,也是反转容器,在链表中任一位置进行插入和删除的时间都是固定的,不支数组表示法和随机访问。
(4) forward_list(C++11):单链表,不可反转的容器,相对list更简单但功能更少。
(5) queue:其操作有:empty()(是否为空);size() (返回元素数目);front() (返回指向队首元素的引用);back() (返回指向队尾元素的引用);push(x) (在队尾插入x);pop() (删除队首元素)。
(6) priority_queue:支持操作与queue相同,区别在于在priority_queue中最大元素被移到队首。
(7) stack:其操作有:empty()(是否为空);size() (返回元素数目);top() (返回指向栈顶元素的引用);push(x) (在栈顶插入x);pop() (删除栈顶元素)。
(8) array:并非STL容器,其长度固定。
5. 关联容器:
(1) set:头文件set中定义,值与键类型相同,键是唯一的。
(2) multiset:头文件set中定义,可能有多个值的键相同。
(3) map:头文件map中定义,值与键类型不同,键是唯一的。
(4) multimap:头文件map中定义,键不唯一。