C++如何实现地图按键排序


本篇内容介绍了“C++如何实现地图按键排序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一个地图由键/值对组成。每一对都是一个元素。一个地图中的所有键都是唯一的。一个地图可以按键进行排序。排序可以是升序或降序。升序是默认的。地图中的排序并不总是直接的。它需要一个比较函数对象。如果比较对象被忽略了,就会发生默认的排序。如果键是恒定的指向字符的指针,地图就会按键的指针排序,而不是按键的字符串字数排序。这几乎不是任何人想要的。考虑以下水果的键/值对和它们的外部颜色。水果是键,而颜色是值。这个元素列表(键/值对)是没有排序的。下面的程序创建了这个列表的映射,并按原样显示,没有按字符串字面排序。输出结果是:plum => purple
blackberry => dark blue-black
watermelon => green
apricot => orange
papaya => orange
banana => yellow未按字符串字面排序,但按指针排序。要在C++程序中使用地图,必须用include指令来包含地图库。创建上述简单地图的另一种方法是如下。输出结果是:plum => purple
blackberry => dark blue-black
watermelon => green
apricot => orange
papaya => orange
banana => yellow未按字符串字面排序,但按指针排序。如果键值是整数,输出将按键值排序。在实践中,许多地图的键是字符串字面。这篇文章解释了字符串字面的键是如何对地图进行排序的。构建地图的完整模板是:类,Compare和Allocator,有默认值。也就是说,它们有默认的专业化,不必在map声明(实例化)中进行类型化。这里要关注的是比较类。这个类的名字是Compare,默认的特殊化是 “less”。”less

一个地图在创建时通常是按键值排序的。如果键是const char*,那么指向引号字面字符串的指针将被排序,而不是字面文本。要在创建过程中把字符串作为键进行排序,字符串必须是由字符串类实例化的字符串对象的字面意思。这意味着必须包括字符串库和地图库。

创建升序

在下面的程序中,地图被创建,升序排序。

#include
#include
#include
usingnamespacestd;
intmain()
{
map>mp;
mp["plum"]="purple";
mp["blackberry"]="darkblue-black";
mp["watermelon"]="green";
mp["apricot"]="orange";
mp["papaya"]="orange";
mp["banana"]="yellow";
for(map::iteratorit=mp.begin();it!=mp.end();it++)
coutfirst"second

输出结果是:

apricot => orange
banana => yellow
blackberry => dark blue-black
papaya => orange
plum => purple
watermelon => green

即使模板中省略了less,排序仍然会是升序的,因为less是默认的。

创建降序

为了创建一个地图,使其按键的降序排序,必须对比较专业化进行编码。下面的程序说明了这一点。

#include
#include
#include
usingnamespacestd;
intmain()
{
map>mp;
mp["plum"]="purple";
mp["blackberry"]="darkblue-black";
mp["watermelon"]="green";
mp["apricot"]="orange";
mp["papaya"]="orange";
mp["banana"]="yellow";
for(map::iteratorit=mp.begin();it!=mp.end();it++)
coutfirst"second

输出结果是:

watermelon => green
plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow
apricot => orange

生成一个范围的降序

一个地图的范围可以按降序产生。这涉及到创建第二个地图,它是第一个地图的一个范围。下面的程序说明了这一点。

#include
#include
#include
usingnamespacestd;
intmain()
{
mapmp;
mp["plum"]="purple";
mp["blackberry"]="darkblue-black";
mp["watermelon"]="green";
mp["apricot"]="orange";
mp["papaya"]="orange";
mp["banana"]="yellow";
map::iteratoritB=mp.begin();
itB++;
map::iteratoritE=mp.end();
itE--;
map>mpR(itB,itE);
for(map::iteratorit=mpR.begin();it!=mpR.end();it++)
coutfirst"second

输出结果是:

plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow

第一个地图对象有六个元素,分别是

apricot=>orange
banana=>yellow
blackberry=>darkblue-black
papaya=>orange
plum=>purple
watermelon=>green

考虑的范围是:

banana=>yellow
blackberry=>darkblue-black
papaya=>orange
plum=>purple
watermelon=>green

在代码中,"itB++"指向{"香蕉","黄色"},"itE-"指向{"西瓜","绿色"}的范围。在C++中处理一个范围时,最后一个元素不参与操作。于是,输出有四个元素,{"西瓜","绿"}被省略了。

第二个map的Compare模板参数的特化是 greater。如果它是less或者省略,那么这个范围会导致升序。

通过键比较两个元素

key_compare key_comp() const

这个成员函数返回map容器用来比较键的比较对象的副本。比较对象是一个函数对象。它将把两个键作为参数,如果左键小于右键,则返回真。有了这个,代码段应该是。

key_comparekc=mp.key_comp();
boolbl=kc("watermelon","apricot");

key_compare不被编译器识别。在这个代码段中消除key_compare,在第二条语句中替换掉kc,结果是。

boolbl=mp.key_comp()("watermelon","apricot");

下面的程序说明了key_comp()的使用。

#include
#include
#include
usingnamespacestd;
intmain()
{
mapmp;
mp["plum"]="purple";
mp["blackberry"]="darkblue-black";
mp["watermelon"]="green";
mp["apricot"]="orange";
mp["papaya"]="orange";
mp["banana"]="yellow";
boolbl=mp.key_comp()("watermelon","apricot");
cout

输出结果是0,表示错误。

上述代码段的真正问题是,key_compare的命名空间没有得到很好的表达。如果这段代码是

map::key_comparekc=mp.key_comp();
boolbl=kc("watermelon","apricot");

它本来可以工作(被编译器接受)。

value_compare value_comp() const

这个成员函数与key_comp()类似。注意:这里指的不是键/值对的值,而是键/值对的元素。所以,value_compare函数对象的两个参数是迭代器元素。下面的程序使用value_comp(),在比较第一个和最后一个元素,{"杏","橙"}和{"西瓜","绿"}:

#include
#include
#include
usingnamespacestd;
intmain()
{
map>mp;
mp["plum"]="purple";
mp["blackberry"]="darkblue-black";
mp["watermelon"]="green";
mp["apricot"]="orange";
mp["papaya"]="orange";
mp["banana"]="yellow";
map::iteratoritB=mp.begin();
map::iteratoritE=mp.e免费云主机域名nd();
itE--;
map::value_comparevc=mp.value_comp();
boolbl=vc(*itB,*itE);
cout

输出是1,表示真。迭代器itB和itE被解读为有它们的元素,用的是嵌套运算符。

对用初始化器列表创建的地图进行排序

在下面的程序中,排序是降序的,键是字符串对象,从字符串类实例化出来。

#include
#include
#include
usingnamespacestd;
intmain()
{
map>mp({{"plum","purple"},{"blackberry","darkblue-black"},{"watermelon","green"},{"apricot","orange"},{"papaya","orange"},{"banana","yellow"}});
for(map::iteratorit=mp.begin();it!=mp.end();it++)
coutfirst"second

输出结果是。

watermelon => green
plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow
apricot => orange

“C++如何实现地图按键排序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

一个地图在创建时通常是按键值排序的。如果键是const char*,那么指向引号字面字符串的指针将被排序,而不是字面文本。要在创建过程中把字符串作为键进行排序,字符串必须是由字符串类实例化的字符串对象的字面意思。这意味着必须包括字符串库和地图库。在下面的程序中,地图被创建,升序排序。输出结果是:apricot => orange
banana => yellow
blackberry => dark blue-black
papaya => orange
plum => purple
watermelon => green即使模板中省略了less,排序仍然会是升序的,因为less是默认的。为了创建一个地图,使其按键的降序排序,必须对比较专业化进行编码。下面的程序说明了这一点。输出结果是:watermelon => green
plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow
apricot => orange一个地图的范围可以按降序产生。这涉及到创建第二个地图,它是第一个地图的一个范围。下面的程序说明了这一点。输出结果是:plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow第一个地图对象有六个元素,分别是考虑的范围是:在代码中,”itB++”指向{“香蕉”,”黄色”},”itE-“指向{“西瓜”,”绿色”}的范围。在C++中处理一个范围时,最后一个元素不参与操作。于是,输出有四个元素,{“西瓜”,”绿”}被省略了。第二个map的Compare模板参数的特化是 greater。如果它是less或者省略,那么这个范围会导致升序。这个成员函数返回map容器用来比较键的比较对象的副本。比较对象是一个函数对象。它将把两个键作为参数,如果左键小于右键,则返回真。有了这个,代码段应该是。key_compare不被编译器识别。在这个代码段中消除key_compare,在第二条语句中替换掉kc,结果是。下面的程序说明了key_comp()的使用。输出结果是0,表示错误。上述代码段的真正问题是,key_compare的命名空间没有得到很好的表达。如果这段代码是它本来可以工作(被编译器接受)。这个成员函数与key_comp()类似。注意:这里指的不是键/值对的值,而是键/值对的元素。所以,value_compare函数对象的两个参数是迭代器元素。下面的程序使用value_comp(),在比较第一个和最后一个元素,{“杏”,”橙”}和{“西瓜”,”绿”}:输出是1,表示真。迭代器itB和itE被解读为有它们的元素,用的是嵌套运算符。在下面的程序中,排序是降序的,键是字符串对象,从字符串类实例化出来。输出结果是。 watermelon => green
plum => purple
papaya => orange
blackberry => dark blue-black
banana => yellow
apricot => orange“C++如何实现地图按键排序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/22 09:48
下一篇 03/22 09:48

相关推荐