vector , stack, queue, map, set都是 stl提供的标准数据结构,他们共同的特点是都是容器,用来存储元素集合。为了统一他们的使用方法, stl提供了迭代器。
容器 | 迭代器功能 | 解释 |
vector | 随机访问 | |
deque | 随机访问 | 双端队列,可以从前后 push,pop 元素 |
list | 双向 | 链表 |
set/multiset | 双向 | multiset 是允许有重复元素的 set ,元素保持有序 |
map/multimap | 双向 | multimap 是允许有重复元素的 map ,元素是 pair 保持有序 |
stack | 不支持迭代器 | 栈 |
queuequeue | 不支持迭代器 | 队列 |
priority_queue | 不支持迭代器 | 优先队列,每次可以从栈顶取出当前最小 |
容器 | 添加元素的效率 | 删除元素的效率 | 查找元素 | 访问中间的元素 |
vector | 加在尾部 O(1)O(1) ,加在中间 O(n)O(n) 。 | O(n)O(n) | O(n)O(n) | O(1)O(1) |
list | O(1)O(1) | O(1)O(1) | O(n)O(n) | O(n)O(n) |
stack | 只能加在栈顶 O(1)O(1) | 只能删除栈顶 O(1)O(1) | 无法查找 | 无法访问 |
queue | 只能加在队尾 O(1)O(1) | 只能删除队首 O(1)O(1) | 无法查找 | 无法访问 |
set/map | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) 更高效率的访问需要自己实现 |
迭代器
容器方法 | 解释 |
begin() | 返回容器首个元素的地址 |
end() | 返回容器最后一个元素再下一个元素的地址 |
rbegin() | 返回容器最后一个元素的地址 |
rend() | 返回容器首个元素再前一个元素的地址 |
find(value) | 查找元素,如果找到返回迭代器位置,否则返回 end() 的位置 |
erase(iterator) | 删除迭代器元素 |
常用操作
begin(), //返回set容器的第一个元素
end(), //返回set容器的最后一个元素
clear(), //删除set容器中的所有的元素
empty(), //判断set容器是否为空
max_size(), //返回set容器可能包含的元素最大个数
size(), //返回当前set容器中的元素个数
rbegin(), //返回的值和end()相同
rend(), //返回的值和begin()相同
erase(iterator), //删除定位器iterator指向的值
erase(first,second), //删除定位器first和second之间的值
erase(key_value), //删除键值key_value的值
find() , //返回给定值值得定位器,如果没找到则返回end()。
set中还有两个非常重要的函数,lower_bound()和upper_bound()。这两个函数都需要传入一个值。
lower_bound返回的是大于或等于被查询元素的第一个元素位置的迭代器,如果找不到,迭代器则为set.end() 。
upper_bound返回值则是>给定val的最小指针(iterator)。
rbegin() 和 rend()为反向迭代器。