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

时间:2017-10-24 20:41:46

标签: c++ string sorting c++11 unordered-map

上周我参加了催化剂编码竞赛,现在我正在尝试用更多高级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位数时,它就会变得混乱。我的问题是:是否有一个功能按照我想要的方式对其进行排序?

1 个答案:

答案 0 :(得分:0)

无序的集合和地图不会对任何内容进行排序。它们是散列容器,仅依赖于密钥的operator==(具有相同散列的所有密钥将保存在某种内部列表或向量中,称为存储桶)。给键的顺序是未指定的。

如果容器内有东西,但是没有分类,则散列容器非常快。如果您想要排序,则必须为network_percent替换std::map的类型。

operator<的{​​{1}}是按字典顺序执行的,因此,您不必在此处执行任何其他操作即可获得意图行为。

注意:您是否注意到为什么std::string被称为unordered_map? :)