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() 只有在键不存在时才插入,如果键已存在,则插入失败,不会修改已有键的值。
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
,查找速度更快(哈希表实现)。