1. 所在头文件: <set>, 命名空间: std ; 声明如下:

 namespace std{
template <class T,
class Compare = less<T>,
class Allocator = allocator<T> >
class set;
template <class T,
class Compare = less<T>,
class Allocator = allocator<T> >
class multiset;
}

  - 只要是assignable+copyable+comparable的类型T都可以作为它们的参数.

  - 内部是用红黑树实现的.

  - set不允许重复元素, 而multiset允许,  它们都不提供用来直接存取元素的任何操作函数.

  - 通过迭代器进行元素间接存取, 有一个限制: 从迭代器角度看, 元素值是常数.

2. 基本操作

  - set 和 multiset的构造/析构形式(6种):

 set c;
set c(op); // op指定排序规则
set c1(c2);
set c(begin,end);
set c(begin,end,op)
c.~set()

  - size()/empty()/max_size()/c1!=c2//c1==c2//c1<c2//c1>c2//c1<=c2//c1>=c2

  - 要求有相同的排序准则. 不然会编译错误, 因为不是相同的类型.

  - set和multiset的查询操作函数(是算法函数的特殊版本, 针对集合进行优化, 可以有对数而非线性效率)

    -  count(elem); //返回值为elem的元素个数

    -  find(elem); //返回元素值为elem的第一个元素位置, 否则返回end()

    -  lower_bound(elem); //返回elem的第一个可插入的位置, 也就是 元素值 >= elem元素值的第一个元素位置.

    -  upper_bound(elem); //和lower_bound()相对

    -  equal_range(elem);//返回的是pair值对

  - 元素的插入和删除

    -  c.erase(elem/pos/[begin,end]);

    -  c.insert(elem/[pos,elem]/[begin,end]);

    -  c.clear();

  - 如果multiset内含有重复元素, 就不能使用 erase()来删除第一个. 一般是用成员函数find()找到一个, 然后erase()

3. 实例:

set:

 #include <iostream>
#include <iterator>
#include <set>
using namespace std;
int main(){
typedef set<int,greater<int> > IntSet;
IntSet coll1;
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert(); copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl; pair<IntSet::iterator,bool> status = coll1.insert();
if(status.second){
cout<<"4 is inserted"<<endl<<distance(coll1.begin(),status.first)+<<endl;
}else{
cout<<"4 is already existed!"<<endl;
coll1.insert();
} copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl; set<int> coll2(coll1.begin(),coll1.end());
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; coll2.erase(coll2.begin(),coll2.find()); copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; cout<<coll2.erase()<<" elem of 5 is removed!"<<endl; copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; return ;
}

multiset:

 #include <iostream>
#include <iterator>
#include <set>
using namespace std;
int main(){
typedef multiset<int,greater<int> > IntSet;
IntSet coll1;
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert();
coll1.insert(); copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl; // 这里运行重复值, 所以没有返回失败状态.
IntSet::iterator pos = coll1.insert();
if(pos!=coll1.end()){
cout<<"4 is inserted"<<endl<<distance(coll1.begin(),pos)+<<endl;
}else{
cout<<"4 is can't be insert!"<<endl;
coll1.insert();
} copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl; multiset<int> coll2(coll1.begin(),coll1.end());
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; coll2.erase(coll2.begin(),coll2.find()); copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; cout<<coll2.erase()<<" elem of 5 is removed!"<<endl; copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl; return ;
}

在执行期指定排序准则(默认是less<T>())

 #include <iostream>
#include <iterator>
#include <set>
using namespace std;
template <class T>
class RuntimeCmp{
public:
enum cmp_mode {normal, reverse};
private:
cmp_mode mode; //在同一个类中定义了枚举, 然后定义变量.
public:
RuntimeCmp(cmp_mode m=normal): mode(m){}
bool operator()(const T& t1, const T& t2) const{
return mode == normal? t1<t2: t1>t2;
}
// 返回值给谁用?
bool operator == (const RuntimeCmp& rc){
return mode == rc.mode;
}
};
typedef set<int,RuntimeCmp<int> > IntSet;
void fill(IntSet & set){
set.insert();
set.insert();
set.insert();
set.insert();
set.insert();
set.insert();
set.insert();
}
int main(){
IntSet coll1;
fill(coll1);
copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
RuntimeCmp<int> reverse_order(RuntimeCmp<int>::reverse);
IntSet coll2(reverse_order);
fill(coll2);
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
coll1 = coll2;
coll1.insert();
copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//比较排序准则是否一致, 由于coll1 从coll2 拷贝而来, 所以一致.
cout<<(coll1.value_comp() == coll2.value_comp())<<endl; return ;
}

STL中 set 和 multiset的更多相关文章

  1. STL中的set/multiset小结

    (1)使用set/multiset之前必须包含头文件<set>:#include<set> (2)namespace std{ template <class T, cl ...

  2. STL中set和multiset小结

    (1)使用set/multiset之前必须包含头文件<set>:#include<set>    (2)namespace std{      template <cla ...

  3. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  4. 【转】 STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  5. HDU 4022 Bombing(stl,map,multiset,iterater遍历)

    题目 参考了     1     2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. ...

  6. (转)STL中set的用法

    转载自here 1.关于set map容器是键-值对的集合,好比以人名为键的地址和电话号码.相反地,set容器只是单纯的键的集合.例如,某公司可能定义了一个名为bad_checks的set容器,用于记 ...

  7. STL中的set容器的一点总结(转)

    STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂 ...

  8. STL中关于map和set的四个问题?

    STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 为何map和set的插入删除效率比用其他序列容器高? 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构. ...

  9. STL中的set使用方法详细!!!!

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

随机推荐

  1. jmeter 模拟ajax/ https请求 失败的解决方法

    1.去掉请求头的Content-Type字段.Host字段 即可

  2. windows下mysql定时备份

    场景:一套B/S小系统,租用了一个虚拟服务器windows 2003,数据库是mysql,做每天的数据库备份 1.关于windows下的定时任务执行     * 命令说明 - /sc 指定计划类型,取 ...

  3. 爬虫中urllib库

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  4. 1、svn架设、基本命令

    SVN是Subversion的简称,是一个开放源代码的版本控制系统.是一项十分基础,必须能够熟练使用的工具.Apache网站:https://subversion.apache.org/ 采用C/S模 ...

  5. C#Question:“XXX”的重载均与“System.Threading.WaitCallback”不匹配。

    public static class ThreadPool // 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器. { [SecuritySaf ...

  6. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  7. addClass()使用方法

    含义:为元素添加指定的样式名 具体用法分为以下两种: 1.可以一次添加一个或者多个用空格隔开的样式名 例: <script> $("ul li").addClass(& ...

  8. kibana-4.6.3-linux-x86_64.tar.gz的安装(图文详解)(升级)

     前期博客 kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解) 因为,我的机器情况是如下: 1.上传 [hadoop@master app]$ rz [hadoop@m ...

  9. 在JBPM的Handle类中调用Spring管理的类

    我们在使用JBPM定义流程的时候经常要在流程定义文件中加入一个继承xxxHandler的类来实现我们的业务逻辑判断或者其他的需求,在这个类中一般都是用Spring的Application来获取,而这种 ...

  10. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 12—Support Vector Machines 支持向量机

    Lecture 12 支持向量机 Support Vector Machines 12.1 优化目标 Optimization Objective 支持向量机(Support Vector Machi ...