上周我参加了催化剂编码竞赛,现在我正在尝试用更多高级C ++重新创建任务。所以我决定使用std::unordered_map
组成一个std::string
作为键值,double
作为映射类型。
数据如下所示:
N0 1.23
N1 2.45
等等。
现在问题是我想用字符串对它进行排序。但是在尝试排序像
这样的更大数字时,它总是会混乱N3 1.23
N10 4.56
因为1 < 3
并且正在比较角色的角色。现在我已经尝试了std::sort
函数,但我真的不明白第三个参数是如何工作的。
我希望有人可以向我解释或者有一个线索如何解决这个问题。
以下是相关的源代码:
std::unordered_map <std::string, unsigned int> network;
unsigned int network_power = 1234;
std::unordered_map <std::string, double> network_percent;
for (std::pair<std::string, unsigned int> element : network) {
double x = ((double)element.second / (double)network_power) * 100;
x = (int)(x * 100 + 0.5) / 100.0;
network_percent.insert({element.first, x});
}
最后,它应该按升序输出network_percent
的每个元素。
提前致谢 菲利普
PS:我已经在StackOverflow上找到了其他文章,但是不理解它们。
编辑:对不起,我写这篇文章已经很晚了。
直到现在我要排序的代码看起来像这样:
std::sort(network_percent.begin(), network_percent.end());
正如彼得贝克尔所说,我希望它以非字典顺序排序。所以,当我得到数据时:
N1 92
N9 309
N2 296
N7 106
N0 218
N3 69
N4 135
N5 68
N6 157
N8 74
N12 576
我希望它像:
N0 218
N1 92
N2 296
N3 69
N4 135
N5 68
N6 157
N7 106
N8 74
N9 309
N12 576
当关键时间超过1位数时,它就会变得混乱。我的问题是:是否有一个功能按照我想要的方式对其进行排序?
答案 0 :(得分:0)
无序的集合和地图不会对任何内容进行排序。它们是散列容器,仅依赖于密钥的operator==
(具有相同散列的所有密钥将保存在某种内部列表或向量中,称为存储桶)。给键的顺序是未指定的。
如果容器内有东西,但是没有分类,则散列容器非常快。如果您想要排序,则必须为network_percent
替换std::map
的类型。
operator<
的{{1}}是按字典顺序执行的,因此,您不必在此处执行任何其他操作即可获得意图行为。
注意:您是否注意到为什么std::string
被称为unordered_map
? :)