与基本容器相比,关联容器更注重快速和高效地检索数据的能力。这些容器是根据键值(key)来检索数据的,键可以是值也可以是容器中的某一成员。这一类中的成员在初始化后都是按一定顺序排好序的。
本文地址:http://www.cnblogs.com/archimedes/p/cpp-set-multiset.html,转载请注明源地址。
set和multiset 容器类(集和多集):#include<set>
<set> 内部它实现: 红黑树
插入删除查找复杂度log(n)
其中所包含的元素的值是唯一的(map)
<multiset> 允许重复元素
集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map(也是一个关联容器,后面将马上要讲到)是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。
在集合中,所有的成员都是排列好的。如果先后往一个集中插入:12,2,3,123,5,65
则输出该集合为:2,3,5,12,65,123
集合(set)与多集(multiset)的区别是:set支持唯一键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。
set和multiset的模板参数
template<class key, class compare, class allocator=allocator>
  • 第一个参数key是所存储的键的类型
  • 第二个参数是为排序值而定义的比较函数的类型
  • 第三个参数是被实现的存储分配符的类型。
在有些编译器的具体实现中,第三个参数可以省略。第二个参数使用了合适形式的迭代器为键定义了特定的关系操作符,并用来在容器中遍历值时建立顺序。集合的迭代器是双向,同时也是常量的,所以迭代器在使用的时候不能修改元素的值。
set定义了三个构造函数:
1、默认构造函数
explicit set(const Compare&=compare());
如:set<int,less<int> > set1;
less<int>是一个标准类,用于形成降序排列函数对象。升序排列是用greater<int>。
2、通过指定某一预先定义的区间来初始化set对象的构造函数
template<class InputIterator> set(InputIterator, InputIterator, const Compare&=compare());
如:set<int ,less<int> >set2(vector1.begin(),vector1.end());
3、复制构造函数
set(const set<Key,Compare&>);
如:set<int ,less<int>>set3(set2);
 
set容器详解:
头文件  #include <set>
定义变量  set <int> myset;
主要成员函数:
  • myset.insert(elem)   向集合中插入数据,如果已经存在则不插入
  • myset.erase(elem)      删除集合中值等于 elem的元素
  • myset.find(elem)       查找值等于elem的元素,若找到返回指向elem的迭代器,否则返回end() ,
  • myset.clear()  清除集合中所有数据
  • myset.size()  返回集合中数据个数
multiset操作详解:
头文件  #include <set>
定义变量  multiset <int> mymulset;
主要成员函数
  • mymulset.insert(elem)   向多重集合中插入数据,
  • mymulset.erase(elem)  删除多重集合中值等于 elem的所有元素,若删除成功返回删除个数,否则返回0
  • mymulset.count(elem)  返回多重集合中数据elem出现的次数
multiset用法:
#include <set>
using namespace std; struct SS {int x,y;};
struct ltstr {
bool operator() (SS a, SS b)
{return a.x < b.x;}
};
int main()
{
set <SS, ltstr> st; // st内的SS元素按x从小到大排序

}

Code1

#include <set>
using namespace std;
struct SS {
int x,y;
bool operator < (struct SS _s) const {
if (x == _s.x) return y < _s.y;
return x < _s.x;
}
};
int main()
{
set <SS> st; // st内的SS元素按x从小到大排序

}

Code2

multiset举例:

#include <iostream>
#include <set>
using namespace std;
int main(void) {
set<int> set1;
for (int i = ; i < ; ++i) set1.insert(i);
for (set<int>::iterator p = set1.begin();p != set1.end();++p) cout << *p << "";
if (set1.insert().second)//把3插入到set1中
//插入成功则set1.insert(3).second返回true,否则返回false
//此例中,集中已经有3这个元素了,所以插入将失败
cout << "set insert success";
else
cout << "set insert failed";
if (set1.find() != set1.end()) { // 查找元素3
cout << "find it.." << endl;
} else {
cout << "not find it.." << endl;
}
if (set1.find() != set1.end()) { // 查找元素100
cout << "find it.." << endl;
} else {
cout << "not find it.." << endl;
}
int a[] = {, , , , , , , , , };
multiset<int> A;
A.insert(set1.begin(), set1.end());
A.insert(a, a + );
cout << endl;
for (multiset<int>::iterator p = A.begin();p != A.end();++p)
cout << *p << " ";
cin.get();
return ;
}

STL--集和多集(set/multiset)的更多相关文章

  1. LUA中将未分类数据分为测试集和训练集

    require 'torch' require 'image' local setting = {parent_root = '/home/pxu/image'} function list_chil ...

  2. STL vector+sort排序和multiset/multimap排序比较

    由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...

  3. 机器学习入门06 - 训练集和测试集 (Training and Test Sets)

    原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 测试集是用于评估根据训练 ...

  4. 斯坦福大学公开课机器学习:advice for applying machine learning | model selection and training/validation/test sets(模型选择以及训练集、交叉验证集和测试集的概念)

    怎样选用正确的特征构造学习算法或者如何选择学习算法中的正则化参数lambda?这些问题我们称之为模型选择问题. 在对于这一问题的讨论中,我们不仅将数据分为:训练集和测试集,而是将数据分为三个数据组:也 ...

  5. 【ML入门系列】(一)训练集、测试集和验证集

    训练集.验证集和测试集这三个名词在机器学习领域极其常见,但很多人并不是特别清楚,尤其是后两个经常被人混用. 在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train ...

  6. sklearn获得某个参数的不同取值在训练集和测试集上的表现的曲线刻画

    from sklearn.svm import SVC from sklearn.datasets import make_classification import numpy as np X,y ...

  7. TMG 2010 使用脚本来导入URL集和域名集

    作为一个网管,相信有领导叫你限制员工上网的情况,例如只限制员工访问某些网站.在禁止的网站数量少的时候,添加URL集或者域名集是一件很简单的事情,如果禁止的网站数量多达1500个呢?如果再使用ISA S ...

  8. 随机切分csv训练集和测试集

    使用numpy切分训练集和测试集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 序言 在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集.此处我们使用numpy完成这个任务. ...

  9. 编译原理-First集和Follow集

    刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法:   ...

  10. sklearn学习3----模型选择和评估(1)训练集和测试集的切分

    来自链接:https://blog.csdn.net/zahuopuboss/article/details/54948181 1.sklearn.model_selection.train_test ...

随机推荐

  1. 搭建WebRtc环境

    0.前言 这次的需求,准备做的是一个类似与QQ视频一样的点对点视频聊天.这几天了解了一些知识后,决定使用HTML5新支持的WebRtc来作为视频通讯.客户端使用支持HTML5浏览器即可.服务器段需要提 ...

  2. Vectoroid

    Use cases Drawing (sketch, illustrations, cartooning, etc). Diagramming (any sort of chart with obje ...

  3. Unity 动画

    Unity 并没有自带建模工具. 3D建模工具 maya, 3dmax, blender Skinned Mesh Renderer Mesh Renderer Mesh Filter Modelli ...

  4. hdu 2152

    题目大意:本题是中文题.读者可以直接到OJ上去阅读.提议并不难理解 代码如下: /* * 2152_1.cpp * * Created on: 2013年8月9日 * Author: Administ ...

  5. webapp,liveapp: 流式布局和rem布局

    liveapp场景应用,一般针对的是移动端,近来也是很火,颇有一些感受,拿来分享一下. 页面宽度范围: 一般移动端页面我们的像素范围是320px-640px,最大640px,最小320px,所以设计稿 ...

  6. Android 简单计算器源码....

    PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧...     顺便去对比了一下别人写的代码...有的使用到了 ...

  7. sql server 查找包含字符串的对象

    sql server 查找包含字符串的对象 SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_ ...

  8. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

  9. CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备

    一.前言 VirtualBox默认是不能识别USB设备的,但可以通过Oracle VM VirtualBox Extension Pack来增强VirtualBox的功能,增强的功能如下: 1. US ...

  10. 2015 Multi-University Training Contest 1 - 1001 OO’s Sequence

    OO’s Sequence Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Mean: 给定一个数列,让你求所有区间上满足 ...