"C++ Primer 学习笔记整理"
在C++编程中,顺序容器是标准模板库(STL)中的核心组成部分,它们提供了一种高效的方式来存储和操作元素集合。顺序容器包括vector、list和deque,每种都有其特定的设计和优化目标。
1. **vector** 是一种动态数组,它在内存中存储一串连续的元素,这使得它可以提供快速的随机访问,即通过下标操作符[]进行访问。vector支持在末尾的高效插入和删除(push_back和pop_back),但在中间插入和删除元素时,由于需要移动元素并可能重新分配内存,效率较低。为避免频繁的内存分配,可以预先使用reserve()函数预留足够的空间。
2. **list** 是一个双向链表,其元素在内存中非连续分布,通过指针链接。list的优势在于插入和删除元素(特别是位于中间的元素)非常快,但不支持随机访问,只能通过迭代器从头到尾遍历。此外,list提供了一些特有的操作,如splice()用于合并列表,sort()用于排序,以及swap()用于交换两个list。
3. **deque** (双端队列)结合了vector的随机访问能力和list的两端高效插入和删除。它由多个连续的内存块组成,每个块的大小通常为512字节,通过映射管理各个块。deque支持push_front()和pop_front()操作,性能与list相似,但在两端操作和随机访问之间取得平衡。
选择顺序容器时,应考虑以下准则:
- 需要随机访问时,vector是首选。
- 已知元素数量时,vector也是好选择,因为它可以避免不必要的内存再分配。
- 对于频繁的插入和删除操作,特别是在容器中间,list更合适。
- 如果只在两端插入和删除,且不关心随机访问,deque是不错的选择。
- 如果需要在输入时中间插入元素,然后进行随机访问,可以先使用list,排序后再转换为vector。
此外,所有顺序容器都支持resize()操作,改变容器的大小,有重载版本允许设置新的大小并初始化新元素。迭代器是访问容器内元素的重要工具,如`*iter`用于获取元素的引用,`iter->mem`访问成员,`++iter`或`iter++`则用于移动迭代器到下一个元素。
模板是C++中实现泛型编程的关键,允许创建泛型类和函数,不指定具体的类型参数。在定义模板时,使用`template<typename 类型参数>`或`template<class 类型参数>`,类型参数如T代表一个未指定的类型。当使用模板时,编译器会根据实参类型实例化模板。模板的使用极大地提高了代码的复用性,例如重载操作符允许为自定义类型定义像内置类型一样的行为,增强了类的行为表现力。