STL中 set 和 multiset
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的更多相关文章
- STL中的set/multiset小结
(1)使用set/multiset之前必须包含头文件<set>:#include<set> (2)namespace std{ template <class T, cl ...
- STL中set和multiset小结
(1)使用set/multiset之前必须包含头文件<set>:#include<set> (2)namespace std{ template <cla ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- 【转】 STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- HDU 4022 Bombing(stl,map,multiset,iterater遍历)
题目 参考了 1 2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. ...
- (转)STL中set的用法
转载自here 1.关于set map容器是键-值对的集合,好比以人名为键的地址和电话号码.相反地,set容器只是单纯的键的集合.例如,某公司可能定义了一个名为bad_checks的set容器,用于记 ...
- STL中的set容器的一点总结(转)
STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂 ...
- STL中关于map和set的四个问题?
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 为何map和set的插入删除效率比用其他序列容器高? 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构. ...
- STL中的set使用方法详细!!!!
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
随机推荐
- bzoj2184: 任意图的匹配
Description 每天都要考,每天都要讲,大家注意力都集中不起来了,每天听解题报告时都有人交头接耳(也包括我,呵呵).这样做大大的影响的学习效率(可能吧).于是,有些好奇心重的同学就开始研究,怎 ...
- 学习:Dom4j和Xpath
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和JAXP. DOM4J使 ...
- 模拟admin组件自己开发stark组件之增删改查
增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelFo ...
- 高效网页去重算法-SimHash
记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯 ...
- AtomicHashMap
folly/AtomicHashmap.h folly/AtomicHashmap.h introduces a synchronized UnorderedAssociativeContainer ...
- RAC的时间同步问题
今天在两个节点上面安装RAC,在安装clusterware的时候OUI总是提示失败.查到资料的得知: 特此记录: 需要在在所有的集群节点上设置正确的日期和时间 在安装 Oracle 集群件.数据库以 ...
- Nginx 服务器开启status页面检测服务状态
一.Nginx status monitor 和apache 中服务器状态一样.输出的内容如: 第1列: 当前与http建立的连接数,包括等待的客户端连接:2 第2列: 接受的客户端连接总数目:20 ...
- 浅谈Java引用和Threadlocal的那些事
这篇文章主要介绍了Java引用和Threadlocal的那些事,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1 背景 某一天在某一个群里面的某个群友突然提出了一个问 ...
- RPC框架的服务注册和发现
https://www.cnblogs.com/valor-xh/p/6281502.html https://blog.csdn.net/listslim1/article/details/5157 ...
- Android SQLite最简单demo实现(增删查改)
本来不太想写这篇博客的,但是看到网上的关于android数据库操作的博文都讲得很详细,对于像我这样的新手入门了解SQLite的基本操作有一定难度,所以我参考了网上的一些博客文章,并自己亲自摸索了一遍, ...