贡献者: addis
pair<string, int> p("abc", 123);,p.first,p.second
p.first, p.second 都相等,== 才会相等.
< 对两种类型都有定义.若 p.first < q.first 则 p < q.若 p.first == q.first(根据 < 来确定,不需要使用 ==),且 p.second < q.second,也有 p < q.
v(N)(default val),v(N,val),v({1,2,3})
v = {1,2,3},(vector<vector<int>> vv;)vv = {{1,2,3},{2,3},{4,5,6}}.
insert(iter, val) 在指定位置插入一个元素.insert(iter, n, val) 插入多个元素.insert(iter, iter2_begin, iter2_end) 第二个 vector 的第一个元素会插入到第一个 vector 的 iter 位置.insert(iter, initializer_list) 插入 initializer_list
erase(iter) 删掉一个元素,erase(iter_beg, iter_end) 删掉一段元素.
.resize() 不会改变原来元素的值,新的值会 value-initialized.
vector<> v(N) 也是 value-initialized.
unordered_map<key类型, val类型>
umap.count(key) 如果存在返回 1,否则返回 0.
unordered_map<>::value_type 是一个 pair<>(key, value)
key 如果不存在,调用 umap[key] 会生成一个新的 pair,其 value 是默认值(例如 int 初始化为 0),并返回该 value 的左值.如果 key 存在,umap[key] 也返回左值.
unordered_map 会先用 std::hash 函数查找 key,如果有 hash collilsion 也没关系,会进一步对比区分.
for (auto &e : umap),每个 e 是一个 pair<>.
umap.insert(pair<>) 可以插入一项,但如果 key 已经存在,则不作为.
pair<>(key1,key2) 作为 key,定义以下类函数 hash_pair,并声明 unordered_map<key类型, val类型, hash_pair>
template<class T> // from boost library
inline void hash_combine(size_t &seed, const T &v) {
seed ^= hash<T>{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
struct hash_pair { // similar to std::hash, for pair<>
template<class T, class T1>
size_t operator()(const pair<T,T1> &a) const {
size_t h = 0;
hash_combine(h, a.first);
hash_combine(h, a.second);
return h;
}
};
unordered_set<>::iterator 获取 iterator 类型,和 umap.begin() 相同.unordered_set<>::const_iterator 获取 iterator to const 类型,和 umap.cbegin() 相同.
iterator 只支持 ++(forward iterator).
umap.erase(key) 或者 umap.erase(iterator) 删除一个 pair,若 key 不存在则不作为,但 iterator 必须要存在(umap.end() 就不行).
map<key类型, val类型, 比较函数(可选), allocator(可选)>
unordered_set<key类型, hash类型(默认 std::hash), ...>
unordered_map 类似,不过只有 key 没有 value
operator=, empty, max_size, begin, end, find, count, emplace, insert, erase
insert 不会报错
erase 不存在的元素不会报错.insert 重复的元素也不会报错.count 只可能返回 0, 1
unordered_set 类似,只是会自动根据元素的大小排序,越小的 iterator 元素值越小.
stack <class T, class Container = deque<T>>
empty, size, top, push, emplace, pop, swap
Container 至少支持的成员函数:empty, size, back, push_back, pop_back
queue<class T, class Container = deque<T>> 像排队一样,后面进,前面出.不支持随机访问.如果要 print,可以复制一个,然后边 print 边 pop.事实上,deque 是可以 iterate 以及随机访问的.
empty, size, front, back, push, emplace, pop, swap,swap 交换两个 queue 的内容:p.swap(q);,相当于 std::swap(p, q).queue 本身并不实现这些功能,只是通过调用 Container 的成员函数来实现(container adaptor).
Container 类型至少应该支持 empty, size, front, back, push_back, pop_front,上一条的功能都是通过调用这些实现的.
deque<class T, class Alloc = allocator<T> >
deque 比 stack 和 queue 功能都要更多.
vector 的拓展版):begin, end, operator[], size, max_size, resize, empty, front, back, push_front, pop_back, pop_front, pop_back, insert, erase, swap, clear, emplace, emplace_front, emplace_back
top,pop)最大的值,但 iterate 时并不是完全排序的.所以比(ordered)set 可能更快.
priority_queue<数值类型, 容器(默认 vector), Compare(默认 less)>
priority_queue<T, vector<T>, std::greater<T>>,或者定义成 template<typename T> using priority_queue2 = std::priority_queue<T, vector<T>, std::greater<T>>;
vector 储存数据.
empty,size,top,push,emplace,pop,swap
sort()(升序排序), merge(list2)(合并两个升序的 list,结果仍然是升序),insert_after(iter, val), insert_after(iter, iter2_beg, iter2_end),erase_after(iter),erase_after(iter_beg, iter_end).