为什么网页不能打开建设银行网站百度推广要企业自己做网站吗
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:18
当前位置: 首页 > news >正文
为什么网页不能打开建设银行网站,百度推广要企业自己做网站吗,上海工商信息查询官网,建湖网站设计hello#xff0c;各位小伙伴#xff0c;本篇文章跟大家一起学习《C#xff1a;map和set》#xff0c;感谢大家对我上一篇的支持#xff0c;如有什么问题#xff0c;还请多多指教 #xff01; 如果本篇文章对你有帮助#xff0c;还请各位点点赞#xff01;#xff01;…hello各位小伙伴本篇文章跟大家一起学习《Cmap和set》感谢大家对我上一篇的支持如有什么问题还请多多指教 如果本篇文章对你有帮助还请各位点点赞 话不多说开始正题
关联式容器
STL中的部分容器如vector、list、deque、forward_list(C11)等称为序列式容器因为其底层为线性序列的数据结构里面存储的是元素本身。
关联式容器也是用来存储数据的与序列式容器不同的是其里面存储的是key, value结构的键值对在数据检索时比序列式容器效率更高。
键值对
用来表示具有一一对应关系的一种结构该结构中一般只包含两个成员变量key和valuekey代表键值value表示与key对应的信息。
就比如英汉字典英文单词为key对应的中文就是value。
template class T1, class T2
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}pair(const T1 a, const T2 b): first(a), second(b)
{}
};树形结构的关联式容器
树型结构的关联式容器主要有四种map、set、multimap、multiset。 这四种容器的共同点是使用平衡搜索树(即红黑树)作为其底层结果容器中的元素是一个有序的序列。
set
set的介绍
set是按照一定次序存储元素的容器在set中元素的value也标识它(value就是key类型为T)并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const)但是可以从容器中插入或删除它们。在内部set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。
注意
与map/multimap不同map/multimap中存储的是真正的键值对key, valueset中只放value但在底层实际存放的是由value, value构成的键值对。set中插入元素时只需要插入value即可不需要构造键值对。set中的元素不可以重复(因此可以使用set进行去重)。使用set的迭代器遍历set中的元素可以得到有序序列set中的元素默认按照小于来比较set中查找某个元素时间复杂度为 l o g 2 n log_2 n log2nset中的元素不允许修改(为什么?)set中的底层使用二叉搜索树(红黑树)来实现。
关于7问题在红黑树中结点的值是不允许修改的一旦修改了就不符合搜索二叉树的规则也就不再是搜索二叉树。
set的使用 可以看到class T实际上就是set::key_type/value_type构成键值对。 Compareset中元素默认按照小于来比较。 Allocset中元素空间的管理方式使用STL提供的空间配置器管理。
关于set的成员函数可查看官网cplusplus—set
set的使用
#include set
void TestSet()
{// 用数组array中的元素构造setint array[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };setint s(array, arraysizeof(array)/sizeof(array));cout s.size() endl;// 正向打印set中的元素从打印结果中可以看出set可去重for (auto e : s)cout e ;cout endl;// 使用迭代器逆向打印set中的元素for (auto it s.rbegin(); it ! s.rend(); it)cout it ;cout endl;// set中值为3的元素出现了几次cout s.count(3) endl;
}map
map的介绍
map是关联容器它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中键值key通常用于排序和惟一地标识元素而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同并且在map的内部key与value通过成员类型value_type绑定在一起为其取别名称为pair: typedef pairconst key, T value_type;在内部map中的元素总是按照键值key进行比较排序的。map中通过键值访问单个元素的速度通常比unordered_map容器慢但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时可以得到一个有序的序列)。map支持下标访问符即在[]中放入key就可以找到与key对应的value。map通常被实现为二叉搜索树(更准确的说平衡二叉搜索树(红黑树))。
map的使用 key: 键值对中key的类型。 T 键值对中value的类型。 Compare: 比较器的类型map中的元素是按照key来比较的缺省情况下按照小于来比较一般情况下(内置类型元素)该参数不需要传递如果无法比较时(自定义类型)需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)。 Alloc通过空间配置器来申请底层空间不需要用户传递除非用户不想使用标准库提供的空间配置器。 注意在使用map时需要包含头文件。
关于map的成员函数可查看官网cplusplus—map
operator[]
(((this-insert(make_pair(k,mapped_type()))).first)).second对于这代码的解释 在元素访问时有一个与operator[]类似的操作at()(该函数不常用)函数都是通过key找到与key对应的value然后返回其引用不同的是当key不存在时operator[]用默认value与key构造键值对然后插入返回该默认valueat()函数直接抛异常。
详细解释 这段表达式 (((this-insert(make_pair(k,mapped_type()))).first)).second 是比较复杂的 C 表达式涉及到了 std::set 的 insert 操作和对返回值的解析。 让我们逐步解释这个表达式 1.make_pair(k, mapped_type()): 2.make_pair 是一个 C 标准库函数模板用于创建一个 std::pair 对象。在这里它用来创建一个键值对其中键是 k值是 mapped_type() 的默认构造值。mapped_type() 是 std::set 中存储的值类型的默认构造值。 3.this-insert(make_pair(k, mapped_type())): 4.this 是指向当前对象的指针或引用。insert 是 std::set 的成员函数用于将一个键值对插入到集合中。insert 返回一个 std::pair 对象其中 .first 是一个迭代器指向插入的元素或已存在的相同键的元素.second 是一个布尔值表示插入是否成功。 5.this-insert(make_pair(k, mapped_type())).first: 6.这部分代码提取了 insert 返回的 std::pair 对象的 .first 成员即一个迭代器。这个迭代器指向 std::set 中插入的元素或已经存在的元素。 7.(((this-insert(make_pair(k, mapped_type()))).first)): 8.通过 () 运算符对 .first 返回的迭代器进行解引用操作得到 std::set 中的元素。因为 std::set 是有序的插入后元素会按照键的顺序排列。 9.(((this-insert(make_pair(k, mapped_type()))).first)).second: 10.最后再次使用 ().second 来访问 std::pair 中的 .second 成员。在 std::set 的情况下.second 成员是集合中元素的值部分即 mapped_type 类型的对象。 综上所述(((this-insert(make_pair(k, mapped_type()))).first)).second 的含义是 11.将键值对 (k, mapped_type()) 插入到当前 std::set 对象中。 12.获取这个插入操作返回的迭代器解引用该迭代器得到 std::set 中的元素。 13.访问这个元素的值部分即 mapped_type 类型的对象。 这段代码的目的通常是在 std::set 中插入一个新的键值对并立即访问或修改插入的元素的值。 map中元素的修改
mapstring, string dict;
dict.insert({ sort, 排序 });
dict.insert({ left, 左边 });
dict.insert({ right, 右边 });dict[left] 左边剩余;
dict[insert] 插入;
dict[string];当[key]不存在时会直接插入[key]元素若存在则返回value可以对其修改如
dict[insert] 插入;
dict.insert({ left, 左边 });
dict[left] 左边剩余;[insert]不存在直接插入 将left的valuve修改为左边剩余
map中的的元素是键值对map中的key是唯一的并且不能修改默认按照小于的方式对key进行比较map中的元素如果用迭代器去遍历可以得到一个有序的序列map的底层为平衡搜索树(红黑树)查找效率比较高 O ( l o g 2 N ) O(log_2 N) O(log2N)支持[]操作符operator[]中实际进行插入查找。
例题
来自力扣前K个高频单词
class Solution {
public:vectorstring topKFrequent(vectorstring words, int k) {}
};答案
class Solution {
public:struct comp{bool operator()(pairstring,int m1,pairstring,int m2){return (m1.second m2.second || (m1.second m2.second m2.first m1.first));}};vectorstring topKFrequent(vectorstring words, int k) {mapstring,int m;for(auto e : words){m[e];}vectorpairstring,int v(m.begin(),m.end());sort(v.begin(),v.end(),comp());vectorstring res;for(int i 0; i k;i){res.push_back(v[i].first);}return res;}
};来自力扣两个数组的交集
class Solution {
public:vectorint intersection(vectorint nums1, vectorint nums2) {}
};答案
class Solution {
public:vectorint intersection(vectorint nums1, vectorint nums2) {setint s1;setint s2;vectorint v1;vectorint res;for(auto e : nums1)// 去重操作{if(s1.insert(e).second){v1.push_back(e);}}for(auto e : nums2)// 去重操作{s2.insert(e);}for(auto e : v1){if(!s2.insert(e).second)res.push_back(e);}return res;}
};你学会了吗 好啦本章对于《Cmap和set》的学习就先到这里如果有什么问题还请指教指教希望本篇文章能够对你有所帮助我们下一篇见
如你喜欢点点赞就是对我的支持感谢感谢
- 上一篇: 为什么没有人做搜索网站了提供给他人做视频解析的网站源码
- 下一篇: 为什么网站打不开it 网站模板
相关文章
-
为什么没有人做搜索网站了提供给他人做视频解析的网站源码
为什么没有人做搜索网站了提供给他人做视频解析的网站源码
- 技术栈
- 2026年04月20日
-
为什么没人做同城购物网站免费一键生成app工具
为什么没人做同城购物网站免费一键生成app工具
- 技术栈
- 2026年04月20日
-
为什么建设文化馆网站北京亦庄网站建设公司
为什么建设文化馆网站北京亦庄网站建设公司
- 技术栈
- 2026年04月20日
-
为什么网站打不开it 网站模板
为什么网站打不开it 网站模板
- 技术栈
- 2026年04月20日
-
为什么网站建设要值班泸州网站建设多少钱
为什么网站建设要值班泸州网站建设多少钱
- 技术栈
- 2026年04月20日
-
为什么网站上传照片传不上去注册免费微网站
为什么网站上传照片传不上去注册免费微网站
- 技术栈
- 2026年04月20日






