关联容器概述
关联容器(associative container)并不是C++11才有的概念,之所以叫关联容器是因为容器中的元素是通过关键字来保存和访问的,与之相对的是顺序容器(sequence container),其中的元素是通过它们在容器中的位置来保存和访问的。
关联容器主要有映射(map)和集合(set),支持通过键来高效地查找和读取元素。map的元素以键-值对(key-value)的形式组织:键用作元素在map类型下进行索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用多重映射(multimap)或多重集合(mutiset)类型,这两种类型允许多个元素拥有相同的键。
set类容器
set类容器内元素的访问
示例
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(3);
st.insert(5);
st.insert(2);
st.insert(3);
for(set<int>::iterator it = st.begin(); it != st.end(); it++)
{
printf("%d ", *it);
}
return 0;
}
运行结果:
可以发现,set内的元素自动递增排序,且自动去除了重复元素
set常用函数实例解析
insert()
find()
find(value)返回set中对应值为value的迭代器
示例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
for(int i = 1; i <= 3; i++)
{
st.insert(i);
}
set<int>::iterator it = st.find(2);
printf("%d\n", *it);
return 0;
}
运行结果:
erase()
- 删除单个元素
- st.erase(value),e.g. st.erase(100);
- st.erase(it),it为元素的迭代器
示例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(100);
st.insert(200);
st.insert(100);
st.insert(300);
st.erase(st.find(100));
st.erase(st.find(200));
for(set<int>::iterator it = st.begin(); it != st.end(); it++)
{
printf("%d\n", *it);
}
return 0;
}
运行结果:
- 删除一个区间内的元素
删除[first,last)区间内的元素
示例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(20);
st.insert(10);
st.insert(40);
st.insert(30);
set<int>::iterator it = st.find(30);
st.erase(it, st.end());
for(set<int>::iterator it = st.begin(); it != st.end(); it++)
{
printf("%d\n", *it);
}
return 0;
}
运行结果:
size()
获取set内元素个数
示例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(2);
st.insert(5);
st.insert(4);
printf("%d\n", st.size());
return 0;
}
运行结果:
clear()
清空set中所有元素
示例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(2);
st.insert(5);
st.insert(4);
st.clear();
printf("%d\n", st.size());
return 0;
}
运行结果: