0 文章目录
- 什么是关联容器
- map set 用法总结 / 区别
- 常见应用:set和数组的转换 / 字符串匹配
1 关联容器
预热两个概念:
- 迭代器:
所有标准库容器都可以使用迭代器来间接访问容器元素
,少数几种容器同时支持下标运算符(如vector)。
与指针类似,
有效的迭代器指向某个元素,或者指向容器中尾元素的下一个位置,其他所有情况都是无效迭代器。
与指针不同的是,
获取迭代器不是使用取地址符,它同时返回迭代器的成员。比如名为begin end 的成员:
begin 返回指向第一个元素的迭代器; end返回指向容器中一个"本不存在的尾后"元素;若容器为空:begin 和 end返回同一个迭代器iterator.
- 容器:
一个容器就是一些特定类型对象的集合。
容器能操作多种数据结构和算法的模板类和函数库,能够像现实中的容器一样存放各种类型的对象,一个容器中的所有对象必须是同一个类型的。
容器的类型:
顺序容器:
vector(向量)、list(双向链表)、forward_list(单向链表)、array(固定大小数组,支持快速随机访问,不能增删元素)、string(与vector类似保存字符的容器)、deque(双队列)、
关联容器:
set(集合)、map(映射)、multiset(多重集合)、multimap(多重映射)、unordered_map、unordered_set、unordered_multimap、unorder_multiset。
以下不确定是不是属于容器:stack(栈)、queue(队列)、priority_queue(优先队列)。
顺序容器: 为程序员提供了控制元素存储和访问顺序的能力。这种
顺序
不依赖元素的值,而是与元素加入容器时的位置相对应。
关联容器中元素的位置由元素相关联的关键字值决定
。
2 map、set
map中的元素是一些 key-value 对,key 关键字用来索引,value 值表述数据;
map中的键值对类型是 pair(一种标准库类型),pair的数据成员是 public 的,分别是 first 和 second,可用 p.first 等直接访问
。
set每个元素只包含一个关键字。
注意:set类型中的元素是 const 的,不能被修改;map 中的元素是 pair,其第一个成员关键字 first 也是 const 的,第二个成员 second 是可以改变的。
两个成员方法的不同:
c.begin(), c.end():返回指向c的首元素和尾元素之后位置的迭代器
c.cbegin(), c.cend():返回const_iterator
map 和 set 的遍历、增删元素示例如下:
//map的遍历
map<string, size_t> word_count;//定义空容器
auto map_it = word_count.begin();//map_it是一个指向容器的引用
while(map_it != word_count.end()){
cout<<map_it->first<<" "<<map_it.second<<endl;
map_it++;
}
//set的遍历
set<int> iset = {1,2,3,4,5};
set<int>::iterator set_it = iset.begin();
if(set_it != iset.end()){
cout<<*set_it<<endl; //*set_it表示读迭代器的内容
set_it++;
}
//map中增加元素,若重复直接忽略
word_count.insert(make_pair(word, 1));
//map中删除元素
word_count.erase(word);
//set中增加元素
vector<int> ivec = {1,2,3,4,1,2,3,4};
set<int> set;
set.insert(ivec.begin(), ivec.end()); //此时set中有4个不重复的元素
set.insert({1,2,3,4,1,2,3,4}); //此时set中有8个元素
//若只关心某个特定元素是否存在于容器中,就用find(),如果不需要计数,就用find
//在可以重复出现关键字的multiset中,可以使用count(),若不存在返回0,若存在 3 个则返回 3
//尤其注意find()的返回值!!!
set.find(1); //返回指向 1 的迭代器
set.count(1); //返回值是2
set.find(11); //返回值是 set.end(),因为set中没有这个元素
3 set和数组的转换
//set和数组的转换,用来找数和去重很好用
将vector转换成set,可以边读入边去重,得到没有重复数字的set;
vector<int> nums = {1,2,3,4,1,2,3,4};
set<int> ans;
vector<int> ANS;
ans.insert(nums.begin(), nums.end());
将set再转换成vector,方便输出;
ANS.assign(ans.begin(), ans.end());
//最后的 ANS 为 {1,2,3,4}
4 字符串匹配
判断条件:字典中能否找到该字符:
if (wordDictSet.find(s.substr(j, i - j)) != wordDictSet.end())
{......}