一:set/multiset的简介

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快

set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)

multiset与set的区别:

set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。

修改值时需注意:

不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。
如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

二:set/multiset对象的默认构造

set<int> setInt;            //一个存放int的set容器。

set<float> setFloat;     //一个存放float的set容器。

set<string> setString;     //一个存放string的set容器。
multiset<int> mulsetInt;            //一个存放int的multi set容器。

multiset<float> multisetFloat;     //一个存放float的multi set容器。

multiset<string> multisetString;     //一个存放string的multi set容器。

三:set对象的拷贝构造和赋值

set(const set &st);                //拷贝构造函数

set& operator=(const set &st);       //重载等号操作符

set.swap(st);                               //交换两个集合容器

四:Set集合的元素排序

set<int,less<int>>  setIntA;  //该容器是按升序方式排列元素。从小到大  //默认升序排序 set<int> setIntA
set<int,greater<int>> setIntB; //该容器是按降序方式排列元素。从大到小
less<int>与greater<int>中的int可以改成其它类型,该类型主要要跟set容纳的数据类型一致。

五:set对象的插入

set.insert(elem);     //在容器中插入元素。

六:set对象的迭代相关函数

set.begin();  //返回容器中第一个数据的迭代器。
set.end(); //返回容器中最后一个数据之后的迭代器。
set.rbegin(); //返回容器中倒数第一个元素的迭代器。
set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。

七:set大小

set.size();   //返回容器中元素的数目
set.empty();//判断容器是否为

八:set的删除

set.clear();          //清除所有元素
set.erase(pos);  //删除pos迭代器所指的元素,返回下一个元素的迭代器。
set.erase(beg,end);       //删除区间[beg,end)的所有元素  ,返回下一个元素的迭代器。
set.erase(elem);     //删除容器中值为elem的元素。

九:set的查找

set.find(elem);   //查找elem元素,返回指向elem元素的迭代器。
set.count(elem);   //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。
set.lower_bound(elem);  //返回第一个>=elem元素的迭代器。
set.upper_bound(elem);       //  返回第一个>elem元素的迭代器。
set.equal_range(elem);              //返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。
由于equal_range返回两个迭代器,而且这两个迭代器被封装在pair中。下面介绍对组pair

十:补充pair对组

(一)使用案例

pair< set<int>::iterator, set<int>::iterator >pairIt = setInt.equal_range(ele);
set里面使用有点不太给力,因为全部排序了,获取的数据全部是相同的

(二)pair含义

pair译为对组,可以将两个值视为一个单元。

pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。

pair.first是pair里面的第一个值,是T1类型。

pair.second是pair里面的第二个值,是T2类型。

十一:使用案例

void main()
{
int r;
srand(time(NULL)); multiset<int> iset; for (int i = ; i < ; i++)
{
r = rand() % ;
cout << r << " ";
iset.insert(r);
}
cout << endl; for (multiset<int>::iterator iter = iset.begin(); iter != iset.end();iter++)
{
cout << *iter << " ";
}
cout << endl; pair<multiset<int>::iterator,multiset<int>::iterator> pis=iset.equal_range(); multiset<int>::iterator first = pis.first;
multiset<int>::iterator second = pis.second;
for (; first != second;first++)
{
cout << *first << " ";
}
cout << endl; system("pause");
}

十二:性能测试

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <cstring> #if _MSC_VER
#define snprintf _snprintf
#endif using namespace std; long get_a_target_long()
{
/******变量声明********/
long target = ;
/**********************/ cout << "targer (0~" << RAND_MAX << "):";
cin >> target;
return target;
} string get_a_target_string()
{
/******变量声明********/
long target = ;
char buf[];
/**********************/ cout << "targer (0~" << RAND_MAX << "):";
cin >> target; snprintf(buf, , "%d", target);
return string(buf);
} //与后面的比较函数中回调参数对应
int compareLongs(const void* l1, const void* l2)
{
return (*(long*)l1 - *(long*)l2);
} int compareStrings(const void* s1, const void* s2)
{
if (*(string*)s1 > *(string*)s2)
return ;
if (*(string*)s1 < *(string*)s2)
return -;
return ;
}

公共函数

(一)multiset测试

#include <set>
//测试muliset-->元素可以重复
namespace jj08
{
void test_multiset(long& ms_size)
{
cout << "\ntest_multiset()*******" << endl; /******变量声明:数组初始********/
char buf[]; /******变量声明:vector初始********/
multiset<string> ms; /******变量声明:记录时间********/
clock_t timeStart = clock(); //开始时间
for (long i = ; i < ms_size; i++)
{
try
{
snprintf(buf, , "%d", rand());
ms.insert(string(buf));
}
catch (exception& e)
{
cout << e.what() << endl;
cout << "Max_size:" << i << endl;
abort(); //终止
}
} cout << "inti multiset use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
cout << "multiset.size:" << ms.size() << endl; //获取multiset大小
cout << "multiset.max_size:" << ms.max_size() << endl; //获取multiset所允许最大长度 /******变量声明:获取我们要查询的数********/
string target = get_a_target_string(); //使用::find方法进行查找
timeStart = clock(); auto pI = find(ms.begin(), ms.end(), target); cout << "::find(),milli-seconds:" << clock() - timeStart << endl;
if (pI != ms.end())
cout << "found:" << *pI << endl;
else
cout << "not found!" << endl; //使用muliset.find查找
timeStart = clock(); pI = ms.find(target); cout << "muliset.find(),milli-seconds:" << clock() - timeStart << endl;
if (pI != ms.end())
cout << "found:" << *pI << endl;
else
cout << "not found!" << endl; }
}

红黑树,使用指针寻址,还要销毁指针,destroy()操作耗时

(二)set测试

#include <set>
//测试set-->元素不可以重复
namespace jj10
{
void test_set(long& s_size)
{
cout << "\ntest_set()*******" << endl; /******变量声明:数组初始********/
char buf[]; /******变量声明:set初始********/
set<string> s; /******变量声明:记录时间********/
clock_t timeStart = clock(); //开始时间
for (long i = ; i < s_size; i++)
{
try
{
snprintf(buf, , "%d", rand());
s.insert(string(buf));
}
catch (exception& e)
{
cout << e.what() << endl;
cout << "Max_size:" << i << endl;
abort(); //终止
}
} cout << "inti set use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
cout << "set.size:" << s.size() << endl; //获取set大小
cout << "set.max_size:" << s.max_size() << endl; //获取set所允许最大长度 /******变量声明:获取我们要查询的数********/
string target = get_a_target_string(); //使用::find方法进行查找
timeStart = clock(); auto pI = find(s.begin(), s.end(), target); cout << "::find(),milli-seconds:" << clock() - timeStart << endl;
if (pI != s.end())
cout << "found:" << *pI << endl;
else
cout << "not found!" << endl; //使用muliset.find查找
timeStart = clock(); pI = s.find(target); cout << "set.find(),milli-seconds:" << clock() - timeStart << endl;
if (pI != s.end())
cout << "found:" << *pI << endl;
else
cout << "not found!" << endl; }
}

由于不允许重复,所以存放的数据只有32768个,查找和释放都快

08--STL关联容器(set/multiset)的更多相关文章

  1. STL关联容器

    这里简单学习一下STL关联容器,主要是map.multimap.set.multiset以及unordered_map.前四个底层实现都是利用红黑树实现的,查找算法时间复杂度为\(O(log(n))\ ...

  2. STL关联容器的基本操作

    关联容器 map,set map map是一种关联式容器包含 键/值 key/value 相当于python中的字典不允许有重复的keymap 无重复,有序 Map是STL的一个关联容器,它提供一对一 ...

  3. STL关联容器总结

    有序的都不带unordered,即如下: set multiset map multimap 其中带multi的表示关键字可以重复 无序的带unordered,如下: unordered_map un ...

  4. STL关联容器值hashtable

    hashtable(散列表)是一种数据结构,在元素的插入,删除,搜索操作上具有常数平均时间复杂度O(1); hashtable名词 散列函数:负责将某一元素映射为索引. 碰撞(collision):不 ...

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

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

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

    STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可 ...

  7. STL List容器

    转载http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html 各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始 ...

  8. STL的基本使用之关联容器:set和multiSet的基本使用

    STL的基本使用之关联容器:set和multiSet的基本使用 简介 set 和 multiSet 内部都是使用红黑树来实现,会自动将元素进行排序.两者不同在于set 不允许重复,而multiSet ...

  9. ###STL学习--关联容器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...

  10. STL的基本使用之关联容器:map和multiMap的基本使用

    STL的基本使用之关联容器:map和multiMap的基本使用 简介 map 和 multimap 内部也都是使用红黑树来实现,他们存储的是键值对,并且会自动将元素的key进行排序.两者不同在于map ...

随机推荐

  1. MyBatis Generator 生成器把其他数据库的同名表生成下来的问题

    [问题] 使用MyBatis Generator生成器时,发现Mapper文件中出现字段与连接数据库不符,经过查找发现该表是其他数据库的同名表的字段. [解决问题] 在构造文件中,这里是generat ...

  2. sql语句修改字段类型和增加字段

    /*修改字段类型*/ ) go /*增加字段和说明*/ ) EXECUTE sp_addextendedproperty N'MS_Description','说明文字',N'user',N'dbo' ...

  3. SSH服务与tcp wrappers实验

    SSH服务与tcp wrappers实验 实验环境: 一台linux(ssh client) 一台linux(ssh server) 实验步骤: 1.配置IP,测试连通性 2.在客户端创建用户yuzl ...

  4. Windows 组策略的生效规则

    一般的继承与处理规则 若上层父OU的某个组策略项目被设定,但是其下层子OU未设定该项目,则下层子OU继承上层父OU的这个组策略项目设定值 若在下层子OU内的某个组策略项目被设定,则此设定值预设会覆盖由 ...

  5. 用addRoutes实现动态路由

    原文转自前端路上,转载请注明出处. 之前在基于Vue实现后台系统权限控制一文中提到路由权限的实现思路,因为不喜欢在每次路由跳转的before钩子里做判断,所以在初始化Vue实例前对路由做了筛选,再用实 ...

  6. OpenGL实例:几何变换

    OpenGL实例:几何变换 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 平移 #include <GL/glu ...

  7. storm ui 网页一直出现提示loading summary

    在更换了一次storm的版本之后:访问 http://mini1:8080/index.html 来查看storm的运行情况,但是出现了网页一直出现提示loading summary,但是通过透明的弹 ...

  8. PLSQL Developer图形化界面新建用户并授权并导入脚本

    最近用了PLSQL Developer第三方的软件.记录一下实现新建用户并授权并导入脚本的功能. 第一步.切换sys用户(如果此处方法已经掌握,直接切换sys即可,就不用看这一步了) 首先检查当前登录 ...

  9. ARTS打卡第三周

    Algorithm 题目描述 Given an array of integers, find if the array contains any duplicates. Your function ...

  10. redis 初步认识二(c#调用redis)

    前置:服务器安装redis 1.引用redis 2.使用redis(c#) 一 引用redis  (nuget   搜索:CSRedisCore) 二 使用redis(c#) using System ...