C++容器操作

C++容器

参考:一万五千字C++STL【容器】详解 (全网最详细)

顺序性容器(Sequence Container)

vector向量,可变大小数组

deque双端队列

list列表,双向链表

forward_list单向链表(C++11)

array不可变大小数组(C++11)

关联性容器(Associative Container)

set/multiset unordered_set(C++11)

map/multimap unordered_map(C++11)

关于map的定义:map是STL里重要容器之一。它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key, value>的键值对。
关于map和unordered_map的区别参考:c++中unordered_map的用法的详述(包含unordered_map和map的区别)
总结来讲就是map底层存储数据采用红黑树(非平衡性二叉搜索树),默认按照key进行排序,因此存储的数据是有序的;unordered_map底层存储数据采用哈希表,因此存储的数据是无序的,但是查找的效率高。
此外,它们对外接口和使用方法基本完全一样,下面对接口进行梳理,方便总结记忆:

1.构造器和初始化

map和unordered_map都属于模板类,其模板类定义以及每模板参数的说明参考:unordered_map使用详解

#include <map>
#include <unordered_map>
map<int, string> mp; // 模板类的默认空构造
// 使用初始化列表进行初始化
map<int, string> mp = map<int, string>({{1, "hello"}, {2, "world"}}); // 显式调用构造函数
map<int ,string> mp({{1, "hello"}, {2, "world"}}); // 隐式调用构造函数
map<int ,string> mp{{1, "hello"}, {2, "world"}};
// 使用拷贝构造函数初始化
map<int, string> mp(other_mp);
// 迭代器初始化
map<int, string> mp(other_mp.begin(), other_mp.end());
// 其他继续补充...
2.迭代器

迭代器的声明方式:
map<int, string>::iterator
map<int, string>::const_iterator

mp.begin(): 返回指向容器中第1个键值对的正向迭代器(map的话是按照key值排序后,按照顺序依次访问;unordered_map则是按照哈希表的索引从小到大依次访问,与元素插入先后顺序也无关)。
mp.end(): 返回指向容器中最后1个键值对之后位置的正向迭代器。
mp.cbegin(): 和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。
mp.cend(): 如上。
mp.rbegin(): 只有map有此接口,返回容器逆序的第一个键值对的双向迭代器。
mp.rend(): 只有map有此接口,返回容器逆序的最后一个键值对的双向迭代器。
mp.crbegin(): 只有map有此接口,如上。
mp.crend(): 只有map有此接口,如上。

3.插入、修改元素

mp.insert(pair<int, string>(3, “nihao”)): 向容器中添加新键值对,如果key已经存在,将不会添加。
mp.emplace(5, “lala”): 向容器中添加新键值对,效率比 insert() 方法高,如果key已经存在,将不会添加。
mp.emplace_hint(): 如上。
mp.erase(key): 删除指定键值对。
mp.erase(mp.begin()): 根据键值对的位置(迭代器)删除。
mp.erase(mp.find(key), mp.end()): 通过迭代器标定的范围,删除范围内的所有元素。

mp.clear(): 清空容器,即删除容器中存储的所有键值对。
mp.swap(other_map): 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。

4.查找元素

operator[key]:该模板类中重载了 [] 运算符,其功能是可以向访问数组中元素那样,只要给定某个键值对的键 key,就可以获取该键对应的值。注意,如果当前容器中没有以 key 为键的键值对,则其会使用该键向当前容器中插入一个新键值对。
at(key):返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。
find(key):查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如 end() 方法返回的迭代器)。

5.获取容量、大小

mp.empty():若容器为空,则返回 true;否则 false。
mp.size():返回当前容器中存有键值对的个数。
mp.max_size():返回容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。
mp.count(key):在容器中查找以 key 键的键值对的个数。
// 以下是针对unordered_map的接口,主要是获取底层存储数据结构中桶的信息
mp.bucket_count():返回当前容器底层存储键值对时,使用桶(一个线性链表代表一个桶)的数量。
mp.max_bucket_count():返回当前系统中,unordered_map 容器底层最多可以使用多少桶。
mp.bucket_size(n):返回第 n 个桶中存储键值对的数量。
mp.bucket(key):返回以 key 为键的键值对所在桶的编号。
mp.load_factor():返回 unordered_map 容器中当前的负载因子。负载因子,指的是的当前容器中存储键值对的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() \ bucket_count()。
mp.max_load_factor():返回或者设置当前 unordered_map 容器的负载因子。

6.其他

rehash(n):将当前容器底层使用桶的数量设置为 n。
reserve(n):将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳count个元(不超过最大负载因子)所需的数量,并重新整理容器。
hash_function():返回当前容器使用的哈希函数对象。

容器适配器

stack栈

queue队列

priority_queue优先队列

参考:C++STL容器用法(全详解)
STL六大部件:

  • 容器
  • 分配器
  • 算法
  • 迭代器
  • 适配器
  • 仿函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值