gpt4 book ai didi

C++ Comparator 函数指定映射的特定键顺序?

转载 作者:行者123 更新时间:2023-11-28 02:18:22 25 4
gpt4 key购买 nike

问题:您将如何编写一个函数来为 map 构造函数执行自定义比较器以创建特定的键顺序?

我有以下字符串键:

"a", "d", "i", "n", "ns", "ne", "vl", "rr"

我正在使用 map 为这些键写入值。但我需要按照上述确切顺序订购它们。 Map 通常创建顺序:

a d i n ne ns rr vl

如何编写可以发送到 map 构造函数的比较器函数,以便我可以保持此顺序?

这是我目前使用的方法

vector<pair<string, string>>({ { "a","" },{ "d","" },{ "i","" },{ "n","" },{ "ns","" },{ "ne","" },{ "vl","" },{ "rr","" }, { "","" } });

...然后我做了一堆 find_if 调用。如果找到,我将值添加到该对中。如果没有,我创建一对新的(在开始时)。我在一开始就这样做,所以如果 key 不存在,我可以只返回“”。好吧,除了我需要对上面没有列出的键进行排序外,这一切都有效,因为可以添加任何键。此外,当我尝试添加一个不存在的 key 时,我的程序崩溃了。必须调试它......但是这种方式令人困惑。使用带有一些特定排序的 map 将非常适合我的需要(在运行时添加的任何键都应该通过默认比较进行排序以及维护顺序。但是可以对这些“未知”( future 添加的)键进行排序) .

我“想要这个”的原因(在评论中提出):我需要在程序的最后一步输出这样的字符串:

",a=legato,d=dn,i=12,n=A3" 

等它们需要按特定顺序排列,因为我稍后需要使用正则表达式(在单独的程序中)来操作此字符串。顺序对于指定的键很重要。由于正则表达式,还必须为未指定的键固定顺序。

最佳答案

您将映射用于排序键的比较器指定为模板参数。所以你的 map 声明看起来像:

std::map<string, value_type, my_comparator> my_map;

比较器是你可以定义的东西,它接受两个 key_type 参数 ab,如果 a 出现在 b 之前(否则为 false)。这方面的一个例子是:

struct my_comparator {
bool operator()(const string &a, const string &b) {
// Return true if a comes before b.
}
}

要实现您在问题中指定的顺序,您可以按照以下方式进行操作。我使用 std::tuple 来确保满足严格的排序标准。

bool operator()(const string &a, const string &b) {
auto a_tuple = std::make_tuple(a == "a", a == "d", a == "i", ..., a);
auto b_tuple = std::make_tuple(b == "a", b == "d", a == "i", ..., a);

return a_tuple < b_tuple;
}

因为这在元组的最后一个元素中有 ab,如果它与您的预定义字符串之一不匹配,它将按这些排序。

关于C++ Comparator 函数指定映射的特定键顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33338227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com