文章目录
1 标准库
标准库不仅能够提供有用的数据结构和函数,还能反映一个具有一致性的体系结构,一旦了解了一种容器的特性,就可以非常轻松的掌握全部库容器的使用方法。
1.1 随机存取和顺序存取
随机存取容器,如vector、string、map就是,比如可以使用A[i]来访问A中的一个元素。
顺序存取容器,如list、set,会进制对它的元素进行随机访问,只能使用迭代器来顺序访问。
1.2 向量vector和表list
vector只在尾部增长或缩小,那向量的性能会非常好。
但是如果在内部插入或删除元素,为了保持快速随机存取的特性,就必须移动位于被插入或删除元素后面的全部元素。这就意味着,所耗费的运行时间会跟向量元素个数的二次方成比列。
但我们可以使用另一个数据结构list,它支持在容器中的任何位置插入和删除元素,不过不支持使用索引的随机访问。
如果给vector添加或删除元素会使得元素后面的迭代器出现失效的情况,而对于list添加或删除(push_back或erase)不会使得指向其他元素的迭代器失效。
对于一个删除容器内部的值的测试:
文件大小 | list | vector |
---|---|---|
735 | 0.1 | 0.1 |
7350 | 0.8 | 6.7 |
73500 | 8.8 | 597.1 |
对于删除73500条记录的文件,list运行时间还不到9s,使用vector却用了几乎10分钟。
1.3 list排序
对于list类的迭代器不要不支持完全随机访问,因此不能使用标准库中的sort函数进行排序,而要使用list类自己提供的sort成员函数。
list<string> s;
s.sort(compare);
1.4 预分配vector的分配
v.reserve(n)
保留空间以保存n个元素,但不对这些元素进行初始化。这个操作不会改变容器的大小。它仅会影响向量对insert或push_back的充分调用而分配内存的频率。
v.resize(n)
给v个新长度,这长度等于n。如果n比v的当前长度小,那么,在这个向量中位于位置n之后的元素会被删除掉。如果n比当前长度大,那新的元素会被添加到向量中,而且这些元素会被初始化成与v的元素类型相应的值。
2 迭代器
2.1
- 一个迭代器为一个值,
- 它能够识别容器以及容器中的一个元素;
- 允许我们检查存储在这个元素中的值;
- 提供操作以移动在容器中的元素;
- 采用对应容器所能够有效处理的方式对可用的操作进行约束。
2.2
每个标准容器都定义了两种相关的迭代器类型:
container-type::const_iterator
container-type::iterator
其中container-type为容器类型,如vector<string>,它包括容器元素的类型。
2.3
可以将iterator类型转为const_iterator,但却不能将 const_iterator转换为iterator。
2.4
const_iterator一般用于仅需读取的操作;
iterator类型用于想使用迭代器修改存储在容器中的值。
2.5
erase会返回一个迭代器,这个迭代器指向紧跟刚刚删除掉元素的后面一个元素。
2.6
for (vector<string>::const_iterator it = bottom.begin(); it != bottom.end() ; ++it) {
ret.push_back(*it);
}
作用同上:
ret.insert(ret.end(), bottom.begin(), bottom.end());
使用头文件<algorithm>的中copy:
std::copy(bottom.begin(), bottom.end(), back_inserter(ret));
back_inserter:为迭代器适配器(头文件<iterator>中定义)
2.7
*it
间接引用迭代器it以获得存储在容器中位于it所指示的位置的值。
这个操作经常于“.”结合起来获取类对象的一个成员。
例如(*it).x产生由迭代器it所指示的对象的一个成员。*的优先级比.低,而跟++和–相同。
it->x
与(*it).x等价,它返回间接调用迭代器it而获得的对象所指示的成员。
3 容器
- 1
c.rend()
对于允许以逆序访问的其元素的容器,
c.rbegin():表示指向容器中最后一个元素的迭代器;
c.rend():表示指向容器中第一个元素之前的那个位置的迭代器。 - 2
container<T>c;
container<T> c(c2);
定一个容器c,如果给定c2,那么c是c2的一个副本;否则c为空。 - 2
container<T> c(n) ;
定一个有n个容器的c。
container<T> c(n,t) ;
定义一个有n个元素的容器c,n的元素是t的副本。
container<T> c(b,e)
创建一个容器,这个容器保存了位于区间[b,e)中的迭代器所知元素的值。