简介
使用set容器,必须包含set 头文件。操作基本与map 的相同
与map容器一样,set 容器的每个键都只能对应一个元素
以一段范围的元素初始化set对象,或在set对象中插入一组元素时,对于每个键,事实上都只添加了一个元素:
set 支持map的很多操作,除了以下的操作:
set不支持下标操作,而且没有定义mapped_type 类型
在set 容器中,value_type不是pair 类型,而是与key_type相同的类型,因为set里面是键的集合。
使用set容器,必须包含set 头文件。操作基本与map 的相同
set容器不提供下标操作符。为了通过键从set中获取元素,可使用find 运算。如果只需要判断某个元素是否存在,同样可以使用count 运算,返回set 中该键对应的元素个数。对于set 容器,count 的返回值只能是1(元素存在)或0(元素不存在)
=============================================================================================
一、引言
map 容器是键—值对的集合,好比以人名为键的地址和电话号码。
set 容器只是单纯的键的集合。适用于只需要判断某值是否存在的情况。而map适用于需要了解键与值的对应的的情况。
set 里面存储的键必须唯一,不能修改,和map一样
set 支持map的很多操作,除了以下的操作:
set不支持下标操作,而且没有定义mapped_type 类型
在set 容器中,value_type不是pair 类型,而是与key_type相同的类型,因为set里面是键的集合。
set 容器和list 容器的区别
set 适用于保存元素值不变的集合
list适用于保存会发生变化的元素(增删改)
二、set 容器的定义和使用
1、set容器的初始化
使用set容器,必须包含set 头文件。操作基本与map 的相同
与map容器一样,set 容器的每个键都只能对应一个元素
- 以一段范围的元素初始化set对象,或在set对象中插入一组元素时,对于每个键,事实上都只添加了一个元素:
vector<int> ivec;
for(vector<int>::size_type i=0;i!=10;i++)
{ivec.push_back(i);
ivec.push_back(i);
}
set<int> iset(ivec.begin();ivec.end());
cout<<ivec.size()<<endl;//20
cout<<iset.size()<<endl;//10
//ivec 里面有20个元素 0-9 每个元素都出现了两次。然后用ivec中所有的元素初始化一个int型的set容器,则这个set容器仅有10个元素:ivec中个不相同的元素。
2、在set中添加元素
set<string> set1;//空的set容器
set1.insert("the");//往set1容器中添加一个元素
set1.insert("end");//往set1容器中再添加一个元素,此时,里面有两个元素
另一种用法是,调用insert函数时,提供一对迭代器实参,插入其标记范围内所有的元素。该版本的insert 函数类似于形参为一对迭代器的构造函数—对于一个键,仅插入一个元素.
- 与map容器一样,带有一个键参数的insert 版本返回pair类型对象,包含一个迭代器和一个bool值,迭代器指向拥有该键的元素,而bool值表明是否添加了元素。使用迭代器对的insert版本返回void类型
set<int> iset2;//空的
iset.insert(ivec.begin(),ivec.end());
3、从set 中获取元素
- set容器不提供下标操作符。为了通过键从set中获取元素,可使用find 运算。如果只需要判断某个元素是否存在,同样可以使用count 运算,返回set 中该键对应的元素个数。对于set 容器,count 的返回值只能是1(元素存在)或0(元素不存在)
iset.find(1);/返回一个迭代器,指向键为1的元素
iset.find(11);/返回一个迭代器,指向末尾
iset.count(1);//返回1,存在1
iset.count(11);//返回0,不存在11
- set中的键也为const。不能修改!!!在获得指向set中某元素的迭代器后,只能对其读,不能写
set<int>::iterator set_it=iset.find(1);
*set_it =11;//错误!!!不能改set里面的元素值
cout<<*set_it<<endl;//可以!!