关联容器set, multiset

set, multiset, map, multimap

  • 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。
  • 除了各容器都有的函数外,还支持以下成员函数。
    • find:查找等于某个值的元素(x<y和y<x同时不成立即为相等)
    • lower_bound:查找某个下界
    • upper_bound:查找某个上界
    • equal_range:同时查找上界和下界
    • count:计算等于某个值的元素个数(x<y和y<x同时不成立即为相等)
    • insert:用以插入一个元素或一个区间

multiset

template<class  Key, class  Pred = less<Key>>, class A=allocator<Key> >

class multiset { …. };

  • Pred 决定了类multiset中比大小的原则,multiset运行过程中,比较两个元素x、y的大小的做法,就是生成一个Pred类型的变量,假定为op,若表达式op(x,y)返回值为true,则x比y小。op一般为函数指针或者函数对象。
  • Pred的缺省类型是less<Key>。
  • less 模板的定义:

template<class T>

struct  less : public binary_function<T, T,bool>

{bool  operator()(const T&x , const T&y){ return x<y ;} const; };

//less模板是靠 < 来比较大小的。

set

template <class  Key , class  Pred = less<Key>, class A = allocator<Key> >

class set{ … }

插入set中已有的元素时,忽略插入。

multiset实验代码:

#include <iostream>
#include <set>

using namespace std;

template <class T>
void Print(T first, T last)
{
    for (; first != last; first++)
    {
        cout << *(first) << " ";
    }
    cout << endl;
}
class A
{
private:
    int n;
public:
    A(int _n) :n(_n) {};
    friend bool operator<(const A & a1, const A& a2)
    {
        return a1.n < a2.n;
    }
    friend ostream & operator<<(ostream & o,const A &a)
    {
        o << a.n;
        return o;
    }
    friend class Myclass;
};
struct Myclass
{
    bool operator()(const A & a1, const A & a2)
    {
        return (a1.n % 10 < a2.n % 10);
    }
};

typedef multiset<A> Mset1;
typedef multiset<A, Myclass> Mset2;//重新定义排序

int main()
{
    const int size = 6;
    A a[size] = { 1, 12, 9, 20, 89 ,78};
    Mset1 m1;
    m1.insert(a, a + size);
    Print(m1.begin(), m1.end());
    m1.insert(20);
    cout << "inserted the number:20" << endl;
    Print(m1.begin(),m1.end());
    Mset1::iterator it;
    it = m1.find(20);
    m1.erase(it);
    cout << "deleted the number:20" << endl;
    Print(m1.begin(), m1.end());
    Mset2 m2;
    m2.insert(m1.begin(), m1.end());
    cout << "the multiset m2 is :" << endl;
    Print(m2.begin(), m2.end());
    return 0;
}

运行结果:

set实验代码:

#include <iostream>
#include <set>
using namespace std;
int main() {
typedef set<int>::iterator IT;
int a[5] = { 3,4,6,1,2 };
set<int> st(a,a+5); // st里是 1 2 3 4 6
pair< IT,bool> result;
result = st.insert(5); // st变成 1 2 3 4 5 6
if( result.second ) //插入成功则输出被插入元素
cout << * result.first << " inserted" << endl; //输出: 5 inserted
if( st.insert(5).second ) cout << * result.first << endl;
else
cout << * result.first << " already exists" << endl; //输出 5 already exists
pair<IT,IT> bounds = st.equal_range(4);
cout << * bounds.first << "," << * bounds.second ; //输出:4,5
return 0;
}

参考链接:

https://www.coursera.org/learn/cpp-chengxu-sheji

时间: 2024-10-13 13:41:41

关联容器set, multiset的相关文章

C++学习笔记之STL标准库(六)set/multiset 关联容器

包含头文件 #include <set>  声明命名空间using namespace std; set/multiset是关联容器的一种,它们会对存储的元素进行自动排序,存储元素的值不能直接的被改变,只能通过删除旧值,再插入新值的方式达到更改元素值的目的.set不允许元素的值有重复,而multiset允许有重复的元素,这是他们的唯一区别.关联容器set, multiset以及后面的map, multimap内部采用的是一种非常高效的平衡检索二叉树:红黑树. 1)构造函数 set(); //创

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

实例讲解,set,multiset,map,multimap关联容器

测试环境:windows 7 vs2010 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数: find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等) lower_bound: 查找某个下界 upper_bound: 查找某个上界 equal_range: 同时查找上界和下界 count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 在学习关联容器之前,我们先

STL 笔记(二) 关联容器 map、set、multimap 和 multimap

STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可反复,即一个 key 仅仅能相应一个 value, 相应头文件<map> multimap 键值对 key-value 存储,key 能够反复,即一个 key 能够相应多个 value, 相应头文件<map> set 仅仅有 key, key 不可反复,相应头文件<set>

STL源码剖析---关联容器

标准关联容器分为set和map两大类,包括multiset和multimap,这些容器的底层机制都是RB-tree.标准之外的关联容器有hashtable 以及以此hash table为底层机制而完成的hash_set(散列集合) hash_map(散列映射表) hash_multiset  hash_multimap. 序列和关联容器各自的内部关系是内含的,例如heap内含一个vector,priority_quehe内含一个heap,stack和queue都内含一个deque,set/map

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

[C++]高效使用关联容器的一些建议

关联容器 本文介绍在关联容器中常见的一些的问题以及提升使用关联容器的建议. 1. 理解相等(equality)和等价(equivalence)的区别. 相等是以operator==为基础的.等价是以operator<为基础的. 例如find的定义是相等,他用operator==来判断,这是比较容易理解的. 而等价关系是以"在已排序的区间中对象值的相对顺序"为基础的.也就是说,如果两个值中任何一个(按照既定的排列顺序)都在另一个的前面,那么他们就是等价的. !(w1 < w2

C++拾遗(七)——关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元

C++primer第十章 关联容器

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 一般来说,如果希望有效地存储不同值的集合,那么使用 set 容器比较合适,而 map 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况.在做某种文本处理时,可使用 set 保存要忽略的单词.而字典则是 map 的一种很好的应用:单词本身是键,而它的解释说明则是值. set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一