繁体   English   中英

使用 std::string 作为字典顺序的键对 unordered_map 进行排序

[英]Sorting a unordered_map with a std::string as a key in lexicographical order

上周我参加了 Catalysts Coding Contest,现在我正在尝试使用更多高级 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());

正如 Peter Becker 所说,我希望它按非字典顺序对其进行排序。 所以当我得到如下数据时:

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 位时,它会搞砸。 我的问题是:是否有按我想要的方式对其进行排序的函数?

无序集合和映射不会对任何内容进行排序。 它们是散列容器,仅依赖于键的operator== (具有相同散列的所有键将保存在连续的内存区域中,称为存储桶)。 给键的顺序是未指定的。

散列容器可以非常快地找到容器内是否有东西,但没有排序。 如果要排序,则必须将network_percent的类型替换为简单的std::map

std::stringoperator<是按照字典顺序实现的,因此,您无需在此处执行任何其他操作即可获得预期行为。

注意:您没有注意到为什么unordered_map被称为unordered吗? :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM