网站建设发展情况wordpress怎么上线
2026/4/17 2:06:23 网站建设 项目流程
网站建设发展情况,wordpress怎么上线,昆明微网站制作,泰安网站建设方案#x1f3ac; 个人主页#xff1a;MSTcheng CSDN #x1f331; 代码仓库 #xff1a;MSTcheng Gitee #x1f525; 精选专栏: 《C语言》 《数据结构》 《C由浅入深》#x1f4ac;座右铭#xff1a; 路虽远行则将至#xff0c;事虽难做则必成#xff01; 前言#x… 个人主页MSTcheng · CSDN代码仓库MSTcheng · Gitee 精选专栏: 《C语言》《数据结构》《C由浅入深》座右铭路虽远行则将至事虽难做则必成前言在上一篇文章中我们介绍了二叉搜索树这种树形结构它与之前学过的序列式容器有所不同。本文将重点讲解基于二叉搜索树实现的另外一个容器map。它的底层实现也采用了平衡二叉搜索树。文章目录一、map的认识1.1 map的基本概念二、map的使用2.1map的构造和迭代器2.2 map的增删查操作2.4multimap的使用三、总结一、map的认识1.1 map的基本概念map:是一种键值对key-value容器每个元素包含一个唯一的键key和对应的值value。键用于排序和唯一标识元素值存储与键关联的数据。map的特点有序性元素按键的升序自动排序。唯一性每个键在map中只能出现一次。(不含重复数据)操作复杂度插入、删除和查找操作的平均时间复杂度为 O(log n)。二、map的使用1、map模板参数介绍关于map的声明有以下一些注意事项第一个模板参数keyKey就是map底层关键字的类型。第二个模板参数T(V)T(V)是map底层value的类型。第三个模板参数比较器set默认要求Key支持小于较如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数。第三个模板参数空间配置器一般情况下不需要传。2、pair的介绍pair是C标准库中的一个模板类用于存储两个不同类型的值通常用于键值对的表示。其定义在头文件中基本形式为std::pairT1, T2。T1就是keyT2就是value。map是C标准库中的关联容器用于存储键值对key-value pairs且键唯一。其定义在头文件中内部通常以红黑树实现以保证元素的有序性。map与pair的联系map的每个元素本质上是一个pair对象具体为std::pairconst Key, T(Value)。键Key被声明为const以确保不可修改只有(value)才能被修改。为什么要有pair从数据访问的角度在前面的二叉搜索树实现的过程中我们通常是将key和value放在一个结点里面要访问结点里面key或value只能通过这个结点去访问但是如果我们结点里存的是一个pair那么拿到一个pair就能同时得到key和value的值这样可以明确的表示这两个数据的关联性避免键和值单独管理。也有利于数据的访问。2.1map的构造和迭代器对于map的构造我们关注以下几个接口即可代码示例#includeiostream#includemapusingnamespacestd;voidtest_map1(){//无参默认构造mapstring,stringdict;//初始化列表构造mapstring,stringdict1{{left,左边},{right,右边},{sort,排序}};//拷贝构造mapstring,stringdict2(dict1);//迭代器区间构造mapstring,stringdict3(dict1.begin(),dict1.end());}2、map的迭代器map的迭代器是一个双向迭代器所以map支持正向和反向迭代遍历默认按照key的升序顺序遍历这是因为其底层采用二叉搜索树结构迭代器遍历遵循中序遍历方式。由于支持迭代器map自然也支持范围for。需要注意的是map允许修改value数据但禁止修改key数据因为修改关键字会破坏底层搜索树的结构。代码示例#includeiostream#includemapusingnamespacestd;voidtest_map2(){//初始化列表构造mapstring,stringdict1{{left,左边},{right,右边},{sort,排序}};//正向遍历for(autoe:dict1){coute.first:e.second ;}coutendl;//反向迭代autoitdict1.rbegin();while(it!dict1.rend()){//map中的key是不能被修改的 只有value能被修改//(*it).first xxx;//key不能被修改//(*it).second xxxx;cout(*it).first:(*it).second ;//cout it-first : it-second ;it;}coutendl;for(auto[k,v]:dict){coutk:vendl;}// 结构化绑定 C14/17auto[x,y]kv1;auto[x1,y1]kv1;x1x;xk;}2.2 map的增删查操作1、插入数据map的插入接口主要掌握以下几个接口代码示例#includeiostream#includemapusingnamespacestd;voidtest_map3(){//map底层其实存的是pair(键值对)pairstring,stringkv1(left,左边);pairstring,stringkv2(right,右边);pairstring,stringkv3(sort,排序);pairstring,stringkv4(const,常量);mapstring,stringdict{kv1,kv2,kv3,kv4};dict.insert({left,哈哈});//若键left已经存在则插入失败dict.insert(pairstring,string(sort,排序));//插入一个pairdict.insert(make_pair(hello,你好));//插入还可以使用make_pairdict.insert({people,人});//隐式类型转化//列表插入autoposdict.begin();dict.insert(pos,{English,英文});vectorpairstring,stringv{{k1,v1},{k2,v2},{k3,v3}};//迭代器区间插入dict.insert(v.begin(),v.end());for(constautoe:dict){coute.first:e.second ;}coutendl;}2、find/count和erase代码示例voidtest_map4(){string arr[]{苹果,香蕉,梨,草莓,香蕉,梨,苹果,梨,苹果};mapstring,intm;for(autostr:arr){//mapstring, int::iterator it m.find(str);autoitm.find(str);if(it!m.end()){//找到了 就加加it-second;}else{//没找到就插入m.insert({str,1});}}for(autoe:m){coute.first:e.second ;}coutendl;string arr2[]{苹果,香蕉,梨,草莓,香蕉,梨,苹果,梨,苹果};mapstring,intm2;//使用count也可以代替findfor(autoe:arr){if(m2.count(e)){//如果元素已经存在 该key对应的value值即可m2[e];//operator[]的使用会在后面介绍}else{//没找到就插入m2.insert({e,1});}}for(autoe:m2){coute.first:e.second ;}coutendl;//删除一个指定的keym.erase(草莓);for(autoe:m){coute.first:e.second ;}coutendl;//删除一个迭代器位置的key 注意key被删除了那么value也跟着直接被删除了autoposm.find(香蕉);if(pos!m.end()){m.erase(pos);}for(autoe:m){coute.first:e.second ;}coutendl;//删除一段迭代器区间的keym2.erase(m2.begin(),m2.end());}运行结果3、lower_bound和upper_bound的使用lower_bound返回指向第一个不小于给定键的元素的迭代器。如果键不存在返回指向第一个大于该键的元素。upper_bound返回指向第一个大于给定键的元素的迭代器。代码示例#includeiostream#includemapusingnamespacestd;voidtest_map5(){mapint,stringm{{1,a},{2,b},{3,c},{5,e},{4,d},{6,f}};autopos1m.lower_bound(2);autopos2m.upper_bound(4);while(pos1!pos2){coutpos1-first:pos1-second ;pos1;}coutendl;autopos3m.lower_bound(2);//可以删除这段区间的值 注意不能再用上面的pos1了因为pos已经改变了m.erase(pos3,pos2);for(autoe:m){coute.first:e.second ;}coutendl;}运行结果4、map的operator[]的使用访问或插入元素当使用map[key]时若key已存在返回对应的值value的引用若key不存在则自动插入一个key到map中其值通过默认构造函数初始化并返回该值的引用。非const限定只能用于非const的map对象因为可能修改map内容(修改某个key对应的value)。代码示例#includeiostream#includemapusingnamespacestd;voidtest_map6(){mapstring,stringdict{{left,左边},{right,右边},{insert,插入},{string,字符串}};//// 1、如果k不在map中insert会插⼊k和mapped_type默认值同时[]返回结点中存储//mapped_type值的引⽤那么我们可以通过引⽤修改返映射值。所以[]具备了插⼊修改功能//2、如果k在map中insert会插⼊失败但是insert返回pair对象的first是指向key结点的//迭代器返回值同时[]返回结点中存储mapped_type值的引⽤所以[]具备了查找修改的功能//dict[set];// 插入一个空字符string的无参构造不传参构造出一个空字符串dict[set]集合;// 修改dict[string]xxxx;// 修改dict[begin]开始;// 插入修改//cout dict[set] endl; // 查找string arr[]{苹果,西瓜,苹果,西瓜,苹果,苹果,西瓜,苹果,香蕉,苹果,香蕉};mapstring,intcountMap;for(autostr:arr){//直接使用operator[] 如果key在那么就对key的value 如果key不在那就直接插入countMap[str];}//结构化绑定for(auto[k,v]:countMap){coutk:vendl;}}值得注意的是在之前讲插入的时候insert的参数为value_type类型而value_typde在map中被typedef为了一个pair而insert的返回值又是一个pair注意这两个pair其实是不一样的⼀个是map底层红黑树节点中存的pairkey, T另⼀个是insert返回值pairiterator,bool下面画图分析说明如果key已经在map中插入失败则返回⼀个pairiterator,bool对象返回pair对象first是key所在结点的迭代器second是false。如果key不在在map中插入成功则返回⼀个pairiterator,bool对象返回pair对象first是新插⼊key所在结点的迭代器second是true。也就是说无论插入成功还是失败返回pairiterator,bool对象的first都会指向key所在的迭代器。那么也就意味着insert插⼊失败时充当了查找的功能正是因为这⼀点insert可以用来实现operator[]。2.4multimap的使用map存储键值对key-value每个键唯一不允许重复键。底层通常实现为红黑树保证元素有序按键排序。multimap允许重复键多个键可以关联不同值。同样基于红黑树实现保持有序性。其它的特性均与map一样。值得注意的是由于multimap支持数据重复所以multimap就不⽀持[]因为⽀持key冗余[]就只能支持插入了不能⽀持修改没有意义。代码示例#includeiostream#includemapusingnamespacestd;voidtest_multimap(){multimapstring,stringdict{{left,左边},{right,右边},{insert,插入},{string,字符串}};//插入相同的keydict.insert({apple,苹果});dict.insert({apple,haha});dict.insert({apple,hehe});dict.insert({string,xxxx});dict.erase(apple);//删除指定的key相应的value也会被直接删除autoposdict.find(string);if(pos!dict.end()){dict.erase(pos);}for(autoe:dict){coute.first:e.second ;}coutendl;}三、总结map 和 multimap 对比总结特性mapmultimap键唯一性键必须唯一键可重复插入操作重复键插入会失败或覆盖允许重复键插入底层实现红黑树有序红黑树有序查找效率O(log n)O(log n)头文件mapmap典型用途字典、一对一映射一对多映射如学生成绩分组

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询