set/multiset容器

shienh 2020年02月08日 257次浏览

set中所有的元素都是按照键值自动排序,set不允许有2个元素相同的键值,所以不能通过迭代器改变set元素的值。
和list一样.删除操作的时候,除了被删除的迭代器会失效,其他迭代器依然有效。也就是说set的iterator是const_iterator.
multiset和set的唯一区别是multise允许有重复的键值

#include <iostream>
#include <set>

using namespace std;

//自定义数据类型需要自定义排序规则,否则insert不成功
//用仿函数进行修改排序规则
class MyCompare{
public:
    bool operator()(int v1,int v2){
        return v1>v2;
    }
};


//默认从小到大排序
void printSet(set<int>& s){
    for(set<int>::iterator it =s.begin();it!=s.end();it++){
        cout<<*it<<"    ";
    }
    cout<<endl;
}

int main(int argc, char *argv[])
{
  //  set<int,MyCompare>s;
    set<int>s;
    s.insert(11);
    s.insert(9);
    s.insert(21);
    s.insert(31);
    s.insert(3);
    //3 9 11 21 31
    printSet(s);

    s.erase(11);
    //3 9 21 31
    printSet(s);

    auto pos = s.find(21);
    //find value:21
    if(pos!=s.end()){
        cout<<"find value:"<<*pos<<endl;
    }
    else{
        cout<<"no find value"<<endl;
    }
    //返回容器中key与KeyElem相等的上下限的两个迭代器
    pair<set<int>::iterator,set<int>::iterator> it = s.equal_range(9);
    if(it.first!=s.end() && it.second!=s.end()){
        //9 21
        cout<<"value1:"<<*(it.first)<<" value2:"<<*(it.second)<<endl;
    }
    else{
        cout<<"equal_range no find value"<<endl;
    }
    return 0;
}