set和map

set

set是一种非线性数据结构。

set 是一个基于红黑树(balanced binary search tree)实现的容器。

集合(set)的类型根据以下的标准可分为4类;

1)是否有序
2)是否重复

set multiset unordered_set unordered_multiset

包含

#include<set>
#include<unordered_set>

构造

//有序不重复
set<int> set={1,3,4,5};
//有序重复
multiset<int> set={1,3,4,5};
///无序不重复
unordered_set<int> set={1,3,4,5};
//无序重复
unordered_multiset<int>set={1,3,4,5};

新增元素

set.insert(2);

删除元素

由于我们不关系元素的位置,故不需用迭代器指定元素位置;

若multiset set={1,3,4,5,1,1};

set.erase(1);//上面的set中所有的set都会被删掉

遍历集合

以unordered_multisetset={1,3,4,5};为例,要对其进行遍历,则使用迭代器即可;

unordered_multiset<int>:iterator it;
for(it=set.begin();it!=set.end();it++){
printf("%d",*it);
}

元素是否在集合中

使用find查找元素,找不到就返回一个尾后迭代器

if(set.find(1)==set.end()){
	printf("1 is not in set!\n");
}else{
	printf("1 is in set!\n");
}

我们也可以使用count,因为count可以获取元素的的数量

所以只要使用count判断该元素在集合中的个数是否等于0就可以了,如果不等于0,就表示在该结合中;而不用像find那样,要用到迭代器;

printf("2 occurs %d times\n",set.count(2));

不允许修改

不允许对set的元素修改,如果硬要修改,就可以先删除再插入.

map

数组的下标只能是整数,为了解决这一个限制

我们使用map,它的下标可以是任意类型。当然,它的元素也可以是任意类型;

从而我们对下标,元素取个名字,叫键,和值;每一对叫键值对;

map本质上就是一个集合,集合元素就是一个个的键值对;

map支持通过key找到value;

学习map的代码时要将之与set进行对比;

包含

#include<map>
#include<unordered_map>

构造

map<char,int> map;//有序,不重复
mutimap<char,int> map;// 有序允许重复
unordered_map<char,int> map;//无序 不允许重复
unordered_multimap<char,int> map;//无序 允许重复

键值对的书写

pair<char,int> pair={'w',0};
//first 提取键 second 提取值
printf("key=%c value=%d\n",pair.first,pair.second);

增加

注:在map中新增不能插入单个值,而要插入一个键值对;

且在map中不允许键重复,而允许值重复;(如果键重复,不出现任何效果)

1.增加键值对(即键本来是没有的)

pair<char,int> pair={'w',0};
map.insert(pair);
map.insert({'o',1});

即map.insert() 用于插入键值对。而pair<char, int> 是 map 的元素类型,也可以直接使用 {key, value} 初始化列表插入。

insert() 只有在键不存在时才插入,如果键已存在,则插入失败,不会修改已有键的值。

 

2.给键赋值

myMap["apple"] = 10;      // 修改键为"apple"的值为10
myMap["grape"] = 4;       // 插入键为"grape",值为4

[] 如果键不存在,会自动创建并赋值;如果键存在,会覆盖旧值

遍历-->取值,取键

在遍历的过程中可以使用it->first和it->second分别取出键和值

// 遍历
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
    std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
}

想找指定的键对应的值,则直接用

 int value = myMap["banana"];

删除

删除元素使用erase函数,在参数中指定键

map.erase('w');

总结 

  • map 是自动按 键升序排列 的。
  • 如果不希望重复的键用 map,允许重复键用 multimap
  • 如果不需要自动排序,考虑 unordered_map,查找速度更快(哈希表实现)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值