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()); // 合法

容器关系比较规则

按照顺序一一比较,按照第一个不相等的结果返回

申请和退回空间

不会改变容器大小

  1. reserve
  2. 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