以std::字符串作为关键字,按字典顺序对一个无序映射进行排序



上周我参加了催化剂编码大赛,现在我正试图用更多的高级C++重新创建任务。因此,我决定使用由std::string作为键值和double作为映射类型组成的std::unordered_map

数据如下:

N0 1.23
N1 2.45

等等

现在的问题是,我想按字符串对其进行排序。但当试图像一样对更大的数字进行排序时,它总是会出错

N3 1.23
N10 4.56

因为CCD_ 4和它正在逐个字符地比较它。现在我已经尝试了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的每个元素。

提前感谢Philipp

附言:我已经在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个数字时,它会出错。我的问题是:是否有一个函数按照我想要的方式排序?

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

哈希容器可以很快发现容器中是否有东西,但没有进行排序。如果要排序,则必须将network_percent的类型替换为简单的std::map

std::stringoperator<是按照字典顺序实现的,因此,您不必在这里做任何其他事情来获得预期的行为。

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

最新更新