6【C++基础】关联容器map、set的使用;map set遍历 增删元素;LeetCode 349/139/140

0 文章目录
  1. 什么是关联容器
  2. map set 用法总结 / 区别
  3. 常见应用:set和数组的转换 / 字符串匹配
1 关联容器

预热两个概念:

  1. 迭代器:
    所有标准库容器都可以使用迭代器来间接访问容器元素,少数几种容器同时支持下标运算符(如vector)。
    与指针类似,有效的迭代器指向某个元素,或者指向容器中尾元素的下一个位置,其他所有情况都是无效迭代器。
    与指针不同的是,获取迭代器不是使用取地址符,它同时返回迭代器的成员。比如名为begin end 的成员:
    begin 返回指向第一个元素的迭代器; end返回指向容器中一个"本不存在的尾后"元素; 若容器为空:begin 和 end返回同一个迭代器iterator.
  2. 容器:
    一个容器就是一些特定类型对象的集合。 容器能操作多种数据结构和算法的模板类和函数库,能够像现实中的容器一样存放各种类型的对象,一个容器中的所有对象必须是同一个类型的。
    容器的类型:
    顺序容器:
    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()) 
{......}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值