set容器,根据平衡二叉树(红黑树)结构,进行的设计。默认按顺序存储,每个元素只包含一个关键字,且无重复,适合高效查找。
unordered_set是无序存储,由哈希函数组织得到。
当只是想知道某个值是否存在时,set是最有用的。
定义及初始化
set<string> st = {"the", "but", "and",
"The", "But", "And"};
//or
vector<string> vec(10,"abc");
set<string> i_st(vec.begin(), vec.end());
//使用一个数组初始化set,可能数组10个元素,set只有5个元素。因为去重了
//or
set<string> i_st;
i_st.insert(vec.begin(), vec.end());
常用操作
1.迭代器类型为const,所以可以用一个迭代器访问set元素,不能修改。
set<int> iset={0,1,2,3,4,5,6,7,8,9};
set<int>::iterater it=iset.begin(); //定义一个迭代器
while(it!=iset.end())
cout<<*it<<endl; //正确,且输出的是有序的。证明插入无序,输出有序
*it = 42; //错误,不能修改值
- 判空、大小
bool n = i_st.empty();
int m = i_st.size();
- 添加、删除、清空元素
//insert插入一个元素,若还需看是否插入成功,看返回值的第二成员即可
i_st.insert(p); //单纯插入
auto it=i_st.insert(p); //it保存返回的pair类型
if(it.second) //返回pair的第二成员是bool,true代表插入成功
i_st.erase(it); //删除it指向的元素,返回下一元素的迭代器
i_st.erase(val); //删除值为val的元素
i_st.erase(it1, it2); //删除区间内的元素,返回下一元素的迭代器
i_st.clear(); //清空set
- 查找元素
i_st.find(ele); //找到了,返回迭代器指向key==ele的元素
//找不到,返回i_st.end()
i_st.count(ele); //返回0或1,相当于是否存在
示例实现
输入一段话,统计除常见单次外,其他单词出现的次数
map<string, int> i_mp;
set<string> i_st = {"the", "but", "and",
"The", "But", "And"}; //常见词,需排除
string str;
while(cin>>str)
if(i_st.find() == i_st.end()) //没在常用单词表里找到该单词str
++i_mp[str]; //若map里有该单词,count+1;没有该单词就自动插入一个