c++学习笔记(五)—— IO、顺序容器和关联容器
IO
文件模式
- in:打开文件时做读操作;
- out:打开文件时做写操作(默认清空云存在的文件流);
- app:在每次写之前找到文件尾(不会清空当前文件数据);
- ate:打开文件后立即将文件定位在文件尾;
- trunc:打开文件时清空已存在的文件流;
- binary:以二进制模式进行IO操作;
顺序容器
类型
- vector:可变数组
- deque:双端队列,支持快速随机访问
- list:双向链表
- forward_list:单向链表
- array:固定数组
- string
初始化
- C c;
- C c1(c2); c1和c2必须是相同类型(容器相同,泛型相同)
- C c1 = c2
- C c{a, b, c}
- C c = {a, b, c}
- C c(b, e); b,e代表迭代器F
- C seq(n); 初始化容器大小
- C seq(n, t); 初始化大小,且每个都是t
assign
支持赋值后的拷贝
list a;
vector b;
a = b; // 非法
a.assign(b.begin(), b.end()); // 合法
容器关系比较规则
按照顺序一一比较,按照第一个不相等的结果返回
申请和退回空间
不会改变容器大小
- reserve
- shrink_to_fit(不保证)
capacity
不分配新的内存空间的前提下最多可以保存多少元素
顺序容器适配器
- stack (除array和forward_list)
- queue (仅list和deque)
- priority_queue (仅vector和deque)
泛型算法
只读算法
- accumulate
- equal
写元素算法
- fill
- back_inserter
- copy
- replace
- replace_copy
重排算法
- sort
- unique
关联容器
- map
- set
- multimap: 不去重map
- multiset: 不去重set
- unordered_map: 哈希map
- unordered_set: 哈希set
- unordered_mutilmap: 哈希不去重map
- unordered_mutilset: 哈希不去重set
定义构建方法
除了自定义类型的比较函数外,还可以设置全局的比较函数
bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() < rhs.isbn();
}
size_t hasher(const Sales_data &sd)
{
return hash()(sd.isbn());
}
multiset bookstore(compareIsbn);
// 桶大小、哈希函数指针和相同判断函数指针
unordered_mutilset bookstore(42, hasher, compareIsbn);
multi中查找元素
因为multi允许重复元素的存在,所以不能用.at
// 第一种:计算数量和迭代器起始位置,进行遍历
string search_item("aquam");
auto entries = authors.count(search_item);
auto iter = authors.find(search_item);
while(entries) {
++iter;
--entries;
}
// 第二种:lower/upper_bound,这两个方法不适用于无序容器
for(auto beg = authors.lower_bound(search_item), end = authors.upper_bound(search_item); beg != end; ++ beg)
cout << beg-second << endl;
无序容器管理操作
unordered_set / unordered_map
- c.bucket_count() - 正在使用的桶的数量
- c.max_bucket_count() - 能容纳的最多桶的数量
- c.bucket.size() - 第n个桶有多少元素
- c.bucket(k) - k在哪个桶中
- local_iterator - 可以用来访问桶中元素的迭代器类型
- const_local_iterator
- c.begin(n), c.end(n) - 桶n的首尾迭代器
- c.cbegin(n), c.cend(n)
- c.load_factor() - 每个桶的平均元素数量,返回float
- c.max_load_factor() - c试图维护的平均桶的大小
- c.rehash(n) - 重组存储,构建hash
- c.reserve(n) - 重组存储,但不重新构建hash