贡献者: 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_map<>::iterator 获取 iterator 类型,和 umap.begin() 相同。unordered_map<>::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 元素地址保证不变。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利