STL容器set用法以及codeforces 685B

以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写.

首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文件#include<set>中.

其内部是用红黑树来实现的, 一个是保证set里面是有序的, 默认的排序是从小到大排序, 而且set容器的元素都是唯一的, 如果里面的元素允许重复那就用 multiset 容器来实现.

1. set的常用操作

s.begin()     返回set容器的第一个元素的位置(第一个迭代器)

s.end()       返回set容器的最后一个元素的位置(最后一个迭代器)

s.clear()     清空set容器

s.empty()     判断set容器是否为空

s.insert()    插入一个元素

s.erase()     删除一个元素

s.size()      返回容器里面有多少个元素

s.max_size()  返回set容器可以包含的元素最大个数
实例:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> s;
int main(int argc, char * argv[]){
    s.clear();
    if(s.empty()) cout<<"容器是空的"<<endl;
    else cout<<"容器不是空的"<<endl;
       s.insert(3);
       s.insert(6);
       s.insert(1);
       cout<<"set的第一个值为:"<<*s.begin()<<endl;
       cout<<"set的最后一个值为:"<<*s.end()<<endl;
       cout<<"set的maxsize的值为:"<<s.max_size()<<endl;
    return 0;
}

运行结果:

2. set的count() 函数

count() 用来查找set中某个值出现的次数, 但是由于set不允许出现重复的元素, 所以在set中用 s.count() 只会返回0或者1, 可以用来判断需要查找的数在set中存不存在, 而在multiset中就可以统计一个数字的出现个数了.

实例:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> s1;
multiset<int> s2;
int main(int argc, char * argv[]){
       s1.insert(3);
       s1.insert(6);
       s1.insert(1);
       s1.insert(1);
       s2.insert(3);
       s2.insert(6);
       s2.insert(1);
       s2.insert(1);
       cout<<"set中1出现的次数:"<<s1.count(1)<<endl;
       cout<<"set中2出现的次数:"<<s1.count(2)<<endl;
       cout<<"multiset中1出现的次数:"<<s2.count(1)<<endl;
       cout<<"multiset中2出现的次数:"<<s2.count(2)<<endl;
    return 0;
}

运行结果:

3.删除元素

s.earse(iterator)      删除iterator指向的值

s.earse(a,b)            删除定位器a和b之间的值

s.earse(key_value)      删除键值key_value的值

实例:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> s;
int main(int argc, char * argv[]){
    set<int>::iterator it;
       set<int>::iterator a;
       set<int>::iterator b;
       for(int i=1;i<=10;i++){
           s.insert(i);
       }
       cout<<"删除之前set中的元素是:"<<endl;
       for(it=s.begin();it!=s.end();it++){
           cout<<*it<<" ";
       }
       cout<<endl;
       s.erase(s.begin()); //删除指向的值
       cout<<"第一次删除之后set中的元素是:"<<endl;
       for(it=s.begin();it!=s.end();it++){
           cout<<*it<<" ";
       }
       cout<<endl;
       a=s.begin();
       cout<<"a指向的值是:"<<*a<<endl;
       b=s.begin();
       b++,b++,b++;
       cout<<"b指向的值是:"<<*b<<endl;
       s.erase(a,b); //删除(a,b)之间的值,a和b都是迭代器
       cout<<"第二次删除之后set中的元素是:"<<endl;
       for(it=s.begin();it!=s.end();it++){
           cout<<*it<<" ";
       }
       cout<<endl;
       s.erase(9); //删除值
       cout<<"第三次删除之后set中的元素是:"<<endl;
       for(it=s.begin();it!=s.end();it++){
           cout<<*it<<" ";
       }
       cout<<endl;
    return 0;
}

运行结果:

可以发现用第二种方法删除的值是 从a到b, 这里是包含a指向的元素而不包含b指向的元素, 就是 [a,b). 同时set中的删除操作是不会进行错误检查的, 比如定位器是否合法等等,所以用的时候要注意.

4.查找元素

前面说过用count()可以进行元素的查找, 还有一个函数find()也可以进行元素查找

count()可以查找元素存不存在,而find()可以找到元素的位置, 但是如果没有找到就返回end().

实例:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<int> s;
int main(int argc, char * argv[]){
    set<int>::iterator it;
    for(int i=1;i<=10;i++){
        s.insert(i);
    }
    cout<<"容器中的元素有:"<<endl;
    for(it=s.begin();it!=s.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
    int a;
    cout<<"请输入要查找的元素:"<<endl;
    while(cin>>a){
        if(s.find(a)==s.end()) cout<<"没有找到该元素"<<endl;
        else cout<<*s.find(a)<<endl;
    }
    return 0;
}

运行结果:

5. s.lower_bound(key_value)    返回第一个大于等于key_value的定位器

  s.upper_bound(key_value)    返回第一个大于key_value的定位器

  这两个函数都是用二分来实现查找的,所以比较快.

  

  

原文地址:https://www.cnblogs.com/wushengyang/p/11934329.html

时间: 2024-11-08 05:56:20

STL容器set用法以及codeforces 685B的相关文章

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

STL的其他用法总结

2017-08-20 17:26:07 writer:pprp 1.adjacent_find() 下面是源码实现: template <class ForwardIterator> ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last) { if (first != last) { ForwardIterator next=first; ++next; while (next != last) {

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,

STL容器之优先队列

STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级.这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面.标准库默认使用<操作符来确定对象之间的优先级关系,所以

STL容器之优先队列(转)

STL容器之优先队列 原地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级.这种队列不

C++ STL容器底层机制

1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array. vector动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配

STL容器删除元素的陷阱

今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector<struct> mFriendList;...std::vector<struct>::iterator iter = mFriendList.begin();for ( ; iter != mFriendList.end(); ++iter){    if (...)        mFr

c++常见的STL容器

c++常见的STL容器 1 队列—queue 我想很多人都知道这个神器—queue 队列queue(FIFO),!!需要头文件 #incldue<queue> 有几种常见操作: 1.queue<类型> q 定义一个某类型的队列q 2.q.push(元素) 把一个元素压入队列q的队首 3.q.pop() 弹出队尾元素 4.q.size() 返回队列中元素的个数 5.q.empty() 判断队列是否为空,为空则返回1,不为空则返回0 6.q.front()返回队首元素 2 栈—stac

Sword STL容器分类介绍

标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单向链表,rope本质上是一个重型字符串 非标准关联容器hash_set.hash_multiset.hash_map和hash_multimap. 标准STL容器提供了四种不同的迭代器:iterator. const_iterator.reverse_iterator和const_reverse_i