STL--集和多集(set/multiset)

与基本容器相比,关联容器更注重快速和高效地检索数据的能力。这些容器是根据键值(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从小到大排序
    …
}

#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从小到大排序
       …
}

multiset举例:

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

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

corel 5k数据集中怎么分训练集和测试集图片?

问题描述 corel 5k数据集中怎么分训练集和测试集图片? 它有50个主题,每个主题100张图像.那么4500张训练图像和500张测试图像怎么分?我感觉图像和标签怎么对不上? 解决方案 楼主,corel5k这个数据集,你有吗?现在我需要做一些实验,但是没有这个数据集,希望得到你的帮助.非常期待你的回复

《写给程序员的数据挖掘实践指南》——5.1训练集和测试集

5.1训练集和测试集 前一章的最后部分中,我们使用了3个不同的数据集:女子运动员数据集.Iris数据集以及汽车MPG数据集.我们把每个数据集分成两个子集,一个用于构建分类器,该数据集称为训练集(training set).另一个数据集用于评估分类器,该数据集称为测试集(test set).训练集和测试集是数据挖掘中的常用术语. 数据挖掘领域的人永远不会在用于训练系统的数据上进行测试!下面以近邻算法为例来解释为什么不能使用训练数据来测试.如果上述例子中的篮球运动员Marissa Coleman在训

测试集 , 训练集和验证集的区别

最近在看机器学习的东西发现验证集的(Validation set) 有时候被提起到,以时间没明白验证集的真正用途. 首先,这三个名词在机器学习领域的文章中是很常见的,以下是这三个词的定义. Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier. Validation set: A set of examples used

Matlab划分测试集和训练集

% x是原数据集,分出训练样本和测试样本 [ndata, D] = size(X); %ndata样本数,D维数 R = randperm(ndata); %1到n这些数随机打乱得到的一个随机数字序列作为索引 Xtest = X(R(1:num_test),:); %以索引的前1000个数据点作为测试样本Xtest R(1:num_test) = []; Xtraining = X(R,:); %剩下的数据作为训练样本Xtraining num_training = size(Xtraining

ACM STL容器和算法

1.4      STL 的组成 STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件.通俗的讲: 容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室--STL里的容器是可容纳一些数据的模板类. 算法:就是往杯子里倒水,往大海里排污,从教室里撵人--STL里的算法,就是处理容器里面数据的方法.操作. 迭代器:往杯子里倒水的水壶,

记录集

记录集     前面已经提到,记录集是ADO中最常用的对象,这并不值得奇怪.毕竟,他们包含着数据.但是,对于记录集还有比想象的更多的内容,知道数据如何保存和处理很重要,因为这为选择使用哪种记录集提供了更多的参考.    记录集有不同的类型,在一些细小的地方存在着差异,很容易造成失误.首先需要认真谈论的是光标的概念. 8.4.1 光标    光标(cursor)是让许多人感到困惑的概念,但实际上非常的简单.    光标用来管理记录集和记录集的当前位置,后者是由当前记录指针来处理的.    这不是R

递归函数(五):递归集与递归可枚举集

递归函数(一):开篇递归函数(二):编写递归函数的思路和技巧递归函数(三):归纳原理递归函数(四):全函数与计算的可终止性递归函数(五):递归集与递归可枚举集递归函数(六):最多有多少个程序递归函数(七):不动点算子递归函数(八):偏序结构递归函数(九):最小不动点定理 回顾 上文中我们讨论了全函数和部分函数,以及计算的可终止性. 本文我们从数论函数开始,给原始递归函数集增加一种新的运算,得到了一个更大的集合. 然后根据递归函数,我们可以定义递归集和递归可枚举集, 为以后讨论可计算性与可判定性打

NYOJ528-找球号(三)

找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数.有一天,xiaod发现 少了一个球,你能帮他找出丢的那个球的球号吗? 输入 有多组测试数据.每组数据包括两行. 第一行是一个整数N(0<N<1000000),表示现在所剩的球数. 随后的一行是N个数,表示所剩的各个球的编号M(0<M<10^9). 输出 对于每组数据,输出弄丢的那个球

推荐系统笔记

1.产生原因 信息过载 无明确需求 2.什么是推荐? 在信息过载又没有明确需求的情况下,找到用户感兴趣的东西. <Mahout实战>上的定义是:推荐就是通过对喜好的这些模式进行预测,借以发现你尚未知晓,却合乎心意的新事物. 3.推荐和搜索区别: 相同点:快速发现有用信息的工具 不同点:搜索引擎是用户找信息:推荐系统是信息找用户 为了解决信息过载的问题,代表性的解决方案是分类目录和搜索引擎.和搜索引擎一样,推荐系统也是一种帮助用户快速发现有用信息的工具.和搜索引擎不同的是,推荐系统不需要用户提供