贡献者: 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
。
make_pair(变量,变量)
可以自动生成对应类型的 pair
std::tie(x,y) = p
可以分别对赋值到两个变量
auto [x, y] = p
也可以。
std::tuple_size<>::value
auto myTuple = std::make_tuple(1, "Hello", 3.14);
// tuple size
cout << "size = " << std::tuple_size<decltype(myTuple)>::value << endl;
// print values
std::apply([](auto&&... args) {
(... , ([]{ std::cout << args << std::endl; }()));
}, myTuple);
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}}
。
data()
返回第一个元素的指针,如果容器为空,那么不会报错且指针未必是 NULL,但被 deference 将出现未定义行为。
data()
将返回 const 指针,v[i]
也是 const reference。其他容器也同理。
insert(iter, val)
在指定位置插入一个元素(原来 iter
处的元素向后移动)。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。
reserve
好,且保证 push_back()
不超出预留的大小,c++ 标准就可以保证元素的地址不变。
unordered_map<key类型, val类型, hasher=...>
,要求元素可以被 hash,可以比较是否相等。
umap.count(key)
如果存在返回 1,否则返回 0。
unordered_map<>::value_type
是一个 pair<>(key, value)
key
如果不存在,调用 umap[key]
会生成一个新的 pair
,其 value 是默认值(例如 int
初始化为 0
),并返回该 value 的左值。如果 key
存在,umap[key]
也返回左值。
[]
不能对 const unordered_map
使用,需要用 .at()
,如果 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=
(copy assignment),empty()
检查是否为空,max_size
最大容量,begin
,end()
,find(元素)
(返回 const iterator,如果找不到返回 end()
),count()
(只可能返回 0, 1
),emplace(初始化args)
,insert(值)
,erase(val或iterator)
erase
不存在的元素不会报错。insert
重复的元素也不会报错。
insert(值).first
返回元素的 iterator,.second
返回是否新插入。
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
功能都要更多。
push
和 pop
不会改变已存在元素的地址,但 C++ 标准不保证这点。要保证用 list
或者 forward_list
。也可以用 vector
事先 reserve
好,保证 push_back()
不超出预留的大小。
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,结果仍然是升序),push_front()
,front()
,insert_after(iter, val)
, insert_after(iter, iter2_beg, iter2_end)
,erase_after(iter)
,erase_after(iter_beg, iter_end)
。
clear()
会销毁所有元素。forward_list
和 list
元素地址保证不变。