数据结构map与set
来源:互联网 发布:数据定义语言包括哪些 编辑:程序博客网 时间:2024/05/23 00:00
map与set
1、set是一个集合容器,它是一种实现了红黑树的平衡让那个二叉树的数据结构,在插入元素时,他会自动调整二叉树的排列,以确保二叉树平衡,符合红黑树的特征.正因为它是一颗红黑树实现,因此在遍历时尝使用中序遍历.它区别于vector与list,在于它的高效率查找,vector与list要想查找一个对象,时间复杂度为O(N),而它只需要O(lgN).set的简单使用:
(1)、它是一个经常使用的数据结构,因此,在STL中,它提供此数据结构的封装,提供一系列接口供人们使用.在使用时,只需添加头文件#include<set>
即可.
查阅文档,在构造set时,提供三个模板参数:
参数解释:第一个参数很明显就是我们要存储的数据类型,第二个参数,我们知道set中元素是互不相同且有序的,在默认情况下它是按照由小到大排列,但如果我们想要从大到小排列,将第二个参数传成 greater<T>
即可.
例如:set<int> a
创建一个保存整形的数据结构,向里面插入元素,按照从小到大排列.
set<int,greater<int>> a
创建和上面一样的数据结构,只不过,它按照从大到小排列.
(2)、常用接口:
a、insert(插入操作):
插入时,我们可以按照第一种方式插入,即直接插入一个数据,很明显使用第一种方式插入时,它返回一个如下pair类型的结构体;
template<class K, class V>struct pair{ K first; V second; pair(const K& key, const V& value) :first(key) , second(value) {}}
我们可以使用声明pair结构体返回值判断插入是否成功:如下:
set<int> a; set<int>::iterator it; pair<set<int>::iterator, bool> ret; a.insert(1); a.insert(2); a.insert(3); ret = a.insert(7); if (ret.second == false) //插入重复的数 { cout << "插入失败" << endl; } else //第一次出现的数 { cout << "插入成功" << endl; }
b、erase(删除操作):
有三种删除方式:即由位置删除、由数据删除、也可删除一段区间
set<int> a;set<int>::iterator it,it1,it2;a.insert(1);a.insert(2);a.insert(3);a.insert(4);a.insert(3);a.insert(6);a.insert(8);a.insert(9);a.erase(1); //第二种方式it = a.find(2);a.erase(it); //第一种方式it1 = a.lower_bound(4); //下界限it2 = a.upper_bound(8); //上界限a.erase(it1,it2); //第三种方式: 删除区间--左闭右开
c、find(查找操作):
查找操作,给定一个数据值,进行查找,若找到,返回一个迭代器;找不到,则返回end();
遍历set:
set<int>::iterator it;while (it != a.end()){ cout << *it << endl; it++;}
d、count
也就是说,count函数只会返回1或者0。
若我们想查询一个数据是否在set中可以用count进行判断
例如:
set<int> a;a.insert(1);a.insert(3);a.insert(2);int ret = 0;ret = a.count(2);if (ret == 0){ cout << "找不到" << endl;}else{ cout << "找到了" << endl;}`
注意的是与find的区别,find成功返回的对象的迭代器,失败返回迭代器末尾end();而count找到返回1,没有找到返回0.
2、map
map和set一样也是一种关联式容器,它区别于set主要它强调的是一个对应关系,map中,每个元素都是由一对数据构成;
使用map需要给定两个模板参数
使用示例:
`
void TestMap(){map<string, string> a;map<string, string>::iterator it;pair<map<string, string>::iterator, bool> mapit;a.insert(pair<string, string>("左边", "left"));a.insert(pair<string, string>("右边", "right"));a.insert(pair<string, string>("上边", "above"));a.insert(pair<string, string>("下边", "below"));mapit = a.insert(pair<string, string>("1111", "below")); //key不能相同,value可以相同if (mapit.second == true) //不存在{ cout << "成功" << endl;}else //已经存在{ cout << "已经存在" << endl;}//查找//iterator find (const key_type& k);map<string, string>::iterator it1;it1 = a.find("左边"); //查找key,同样查找成功,返回对象位置,查找失败,返回迭代器末尾if (it1 != a.end()){ cout << "找到" << endl;}else{ cout << "没有找到" << endl;}//删除//void erase(iterator position);a.erase(it1);//size_type erase(const key_type& k);a.erase("上边");//void erase(iterator first, iterator last);a.erase(it1, a.end());}
阅读全文
1 0
- 数据结构map与set
- ES6(五) Set与Map的数据结构
- 数据结构 list map set
- Set和Map数据结构
- Set和Map数据结构
- Set和Map数据结构
- [数据结构]Map和Set
- Set和Map数据结构
- Set和Map数据结构
- Set和Map数据结构
- Set和Map数据结构
- C++ map,set内部数据结构
- C++ map,set内部数据结构
- C++ map,set内部数据结构
- 常用数据结构 List set map
- 常用数据结构 List set map
- C++ map,set内部数据结构
- C++ map,set内部数据结构
- mybatis连接oracle,为什么要设置字段默认类型
- 错误:VC6.0 error LNK2001:unresolved external symbol _main
- day10-程序的启动原理
- Easyui combotree 获取根节点以及所有节点的方法
- [优质例子存档]Spring的两种依赖注入方式:setter方法注入与构造方法注入
- 数据结构map与set
- 重温delphi之控制台程序:Hello World!
- sql优化
- 内存布局深度好文
- 函数高扇入合理扇出
- Android面试复习(Android篇一)
- Spring
- CentOS下安装配置Phabricator
- CSS基本样式和模型