1.se't/multiset容器简介
set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
◎ set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
◎ set不可以直接存取元素。(不可以使用at.(pos)与操作符)。
◎ multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。◎ 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
2.se't容器的查找
◎ set.find(elem); //查找elem元素,返回指向elem元素的迭代器。
◎ set.count(elem); //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说值可能大于1。
◎ set.lower bound(elem); //返回第一个>=elem元素的迭代器
◎ set.upper bound(elem); // 返回第一个>elem元素的迭代器。
代码示例:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
set<int>s1;//set容器默认是升序排序
s1.insert(3);
s1.insert(2);
s1.insert(6);
s1.insert(9);
s1.insert(1);
s1.insert(1);
set<int>::iterator it;
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<" ";//1 2 3 6 9
cout<<endl;
set<int>::reverse_iterator it2;
for(it2=s1.rbegin();it2!=s1.rend();it2++)
cout<<*it2<<" ";//9 6 3 2 1
cout<<endl;
set<int>s2(s1);//调用拷贝构造函数
set<int>s3;//调用默认构造函数
s3=s2;
for(it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//1 2 3 6 9
cout<<endl;
s3.insert(10);
s3.swap(s1);
for(it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//1 2 3 6 9
cout<<endl;
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<" ";//1 2 3 6 9 10
cout<<endl;
//将set容器中的最小值删掉
it=s3.begin();
s3.erase(it);
for(it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//2 3 6 9
cout<<endl;
//将set容器中的最大值删掉
it=s3.end();
it--;
s3.erase(it);
for(it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//2 3 6
cout<<endl;
#if 0
//set容器不支持使用反向迭代器对元素进行删除
set<int>;;reverse_iterator it3=s3.rebegin();
s3.erase(it3);
#endif
//删除指定的值`
cout<<s3.erase(3)<<endl;// 1(true)
s3.erase(3);
for(it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//2 6
cout<<endl;
//如果需要删除的元素不在set中,erase函数如果需要删除的元素在set中放回true,否则返回false
cout<<s3.erase(100)<<endl;// 0(false)
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int,less<int>>s1;//升序排列
set<int,greater<int>>s2;//降序排列
s1.insert(1);
s1.insert(5);
s1.insert(3);
s2.insert(1);
s2.insert(5);
s2.insert(3);
set<int>::iterator it;
it=s1.find(3);//找3
cout<<*it<<endl;//3
//如果找不到指定元素,返回end()
it=s1.find(10);
if(it==s1.end())
cout<<"can not find elem";//can not find elem
else
cout<<*it<<endl;
cout<<endl;
cout<<s1.count(1)<<endl;//1
cout<<s1.count(10)<<endl;//0
//查找第一个>=6的元素
s1.insert(6);
s1.insert(8);
s1.insert(7);
s1.insert(10);
it=s1.lower_bound(6);
cout<<">=6:"<< *it<<endl;//6
//查找一个>6的元素
it=s1.upper_bound(6);
cout<<">6:"<< *it<<endl;//7
#if 0
cout<<"s1:";
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<" ";//1 3 5 6 7 8 10
cout<<endl;
cout<<"s2:";
for(it=s2.begin();it!=s2.end();it++)
cout<<*it<<" ";//5 3 1
#endif
return 0;
}