当前位置:   article > 正文

数据结构map与set_map set greater

map set greater

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)
    {}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
我们可以使用声明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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
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);        //第三种方式: 删除区间--左闭右开
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
c、find(查找操作):

这里写图片描述

查找操作,给定一个数据值,进行查找,若找到,返回一个迭代器;找不到,则返回end();
遍历set:
set<int>::iterator it;
while (it != a.end())
{
    cout << *it << endl;
    it++;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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;
}`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
注意的是与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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/570907
推荐阅读
相关标签
  

闽ICP备14008679号