set multiset 容器
set 概念
- set是个集合容器,其中所包含的元素是唯一的,集合的元素按照一定的顺序排列,元素插入按照一定规则插入,所以不能指定插入位置
- set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树,在插入和删除上比vector快。
- set与multiset的区别:set 支持唯一的键值,每个元素值只能出现一次,而multiset一值可以出现多次。
- 不可以直接修改set容器和multiset容器的值
#include<iostream>
#include<array>
#include<set>
void testSet()
{
array<int , 5> = {1 , 2 , 3 , 4 , 5};
//构造函数
set<int> nset(arr.begin() , arr.end());
//插入数据
nset.insert(88);
nset.insert(66);
//获取数据
for(set<int>::iterator it = nset.begin();it != nset.end();it++)
{
cout<<*it<<" ";
}
//开始遍历
for(const int n : nset)
{
cout<<n<<" ";
}
//查找数据
auto find_it = nset.find(88);
if(find_it != nest.end())
{
cout<<"已找到"<<*findIt; //迭代器返回
}
//删除数据
nset.erase(findIt);
//就地构造:就是在元素是类对象时
nset.emplace(100);
//升序
set<int , greater<>>gSet = { 3 , 8 , 1 , 5 ,35 };
}
int main()
{
testSet();
}
set自定义的类
#include<iosteam>
#include<set>
int main()
{
//统计元素个数
set<int> nset = { 1, 2 , 3 , 4 , 5 };
size_t cnt = nset.count(5);
multiset<int> mset = { 1, 2 , 3 , 4 , 5 };
cnt = mset.count(1); //统计1的数量
//查找
pair<set<int>::iterator,set<int>::iterator> it = nset.equal_range(5);
if(pa.first != nset.end())
{
cout<<*pa.first<<endl;
}
}
map概念
map是关联容器,用于存储特定顺序由键值和映射值形成的元素,它基于key的快速检索能力。
map中的key是唯一的值,集合中的元素按一定顺序排列,元素插入过程是按照排序规则插入,所以不能指定插入位置。
map中具体实现是采用红黑二叉树变体的平衡二叉树的数据结构,在插入操作和删除操作比vector快。
map可以直接存储key所对应的value。
#include<iostream>
#include<map>
#include<string>
void TestMap()
{
//学号 姓名
map<int string> stus;
//匿名构造
stus.insert( { 0 , "木槿家的巷港"} );
//就地构造
stus.emplace( 3 , "xx");
//访问元素
string& name = stus.at(3);
//下标法访问元素
string& name1 = stus[3];
//下标访问需要注意
stus[3] = "kdsh";
name1 = stus[3];
}
int main()
{
TestMap();
}
STL共性机制
STL容器所提供的都是值,而非引用的寓意,也就是说当给我们给容器插入值的时候,容器内部实现了拷贝的动作,将我们要插入的元素另行拷贝到另外的一容器中,而不是将原本的数据直接放入原来的容器中,也就是说我们提供的数据必需能够进行拷贝。
- 除了queue和stack之外,每个容器都提供可放回迭代器函数,运用返回迭代器函数可以访问元素。
- 通过STL不会抛异常,需要使用者传入正确的参数。
- 每个容器都提供一个构造函数和拷贝构造函数。
- 大小相关构造方法
(1) size()返回容器元素个数。
(2)empty()判断容器是否为空。
以上均是学习笔记,如有问题请指正,争取做到日更。加油!