一、C++容器分类
C++容器可分为序列式容器和关联式容器两大类,序列式容器包括 array、vector、list(双向链表)、deque(双端队列) 和 forward_list,关联式容器又分为排序关联式容器和无序关联式容器
换句话说STL 提供有 3 类标准容器,分别是序列容器、排序容器和哈希容器,其中后两类容器有时也统称为关联容器
关联式容器存储的是**“键值对”**形式的数据
二、键值对pair类
头文件<utility>
提供创建 pair 对象的方法之外,还为 pair 对象重载了 <、<=、>、>=、==、!= 这 6 的运算符,对于进行比较的 2 个 pair 对象,先比较 pair.first 元素的大小,如果相等则继续比较 pair.second 元素的大小,对于进行比较的 2 个 pair 对象,其对应的键和值的类型比较相同,否则将没有可比性。
swap()互换 2 个 pair 对象的键值对,前提是这 2 个 pair 对象的键和值的类型要相同
pair1.swap(pair2)
make_pair(key,value)
三、map 、set
<map> 头文件中,并位于 std 命名空间
作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。
map 容器按照既定的规则自动根据各键值对的键的大小做升序排序。默认情况下选用std::less排序规则(其中 T 表示键的数据类型)也可以自定义排序规则
map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。
multimap 和 map 容器的区别在于,容器中可以同时存储多(≥2)个键相同的键值对
set仍然是以键值对存储数据,它和map的唯一的区别在于set只能存key和value的值相等的键值对为了节约空间当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可使用 set 容器存储的各个元素的值必须各不相同
set 详解
和 map 容器不同 C++ STL 中的 set 容器类模板中未提供 at() 成员函数,也未对 [] 运算符进行重载。因此,要想访问 set 容器中存储的元素,只能借助 set 容器的迭代器。
值得一提的是,C++ STL 标准库为 set 容器配置的迭代器类型为双向迭代器。这意味着,假设 p 为此类型的迭代器,则其 只能进行 ++p、p++、–p、p–、*p 操作并且 2 个双向迭代器之间做比较也只能使用 == 或者 != 运算符
创建并初始化set容器
std::set<std::string> myset{ "http://c.biancheng.net/java/",
"http://c.biancheng.net/stl/",
"http://c.biancheng.net/python/"
};
利用双向迭代器,遍历myset 不再像map一样iter还有first和second两个域 直接*iter访问数据
因为 iter 迭代器指向的是 set 容器存储的某个元素而不是键值对
因此通过 *iter 可以直接获取该迭代器指向的元素的值。
for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
cout << *iter << endl;
}
set insert 的四种方法
1、
//普通引用方式传参
pair<iterator,bool> insert (const value_type & val);
//右值引用方式传参
pair<iterator,bool> insert (value_type && val);
返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:
当向 set 容器添加元素成功时,该迭代器指向 set 容器新添加的元素,bool 类型的值为 true;
如果添加失败,即证明原 set 容器中已存有相同的元素,此时返回的迭代器就指向容器中相同的此元素,同时 bool 类型的值为 false。
左值引用、右值引用详解http://c.biancheng.net/view/439.html
2、
//以普通引用的方式传递 val 值
iterator insert (const_iterator position, const value_type & val);
//以右值引用的方式传递 val 值
iterator insert (const_iterator position, value_type && val);
使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整。也就是说,insert() 方法中指定新元素插入的位置,并不一定就是该元素最终所处的位置。
当向 set 容器添加元素成功时,该迭代器指向容器中新添加的元素;
当添加失败时,证明原 set 容器中已有相同的元素,该迭代器就指向 set 容器中相同的这个元素。
3、
void insert (InputIterator first, InputIterator last);
向当前 set 容器中插入其它 set 容器指定区域内的所有元素,只要这 2 个 set 容器存储的元素类型相同 半闭半开 [ first, last)
4、
void insert ( {E1, E2,…,En} ); 一次添加多个元素
set三种删除方法
//删除 set 容器中值为 val 的元素
size_type erase (const value_type& val);
//删除 position 迭代器指向的元素
iterator erase (const_iterator position);
//删除 [first,last) 区间内的所有元素
iterator erase (const_iterator first, const_iterator last);
关联式容器map的使用方法和无序关联式容器unordered_map完全一样 传送门
(https://blog.youkuaiyun.com/Wjf7496/article/details/108987535)