c ++:使用元素转换而不是比较器

问题描述 投票:0回答:1

我为此搜索了c ++类似物(python):

sorted(vector, key=lambda x : my_function(x))

当然有结构:

std::sort(vector.begin(), vector.end(), [](const auto& lhs, const auto& rhs) {
    return my_function(lhs) < my_function(rhs);
});

我只是想知道是否存在一个参数的构造。谢谢

c++ comparator
1个回答
0
投票

如果我对问题的理解正确,您正在询问标准库中是否存在按给定键而不是使用比较器进行排序的排序函数。

标准库中没有类似的东西。在Python中,由于对象是基于表的-由于结构或记录的基本概念最终在语言中实现为字符串键和可能是函数的值之间的映射,因此可以简洁地引用字段作为字符串。在C ++中不是这种情况。如果您有类似的东西

struct Foo {
    std::string name;
    int id;
};

字符串“ name”和“ id”对于正在运行的程序是未知的;它们是源代码的工件。因此,请执行Python排序之类的操作,您需要提供一个函数(或无论如何都可以调用的对象)以提取要使用的键值。类似以下内容将起作用:

template<typename Iter, typename Func>
void sort_by_key(Iter from, Iter to, Func get_key) {
    std::sort(from, to, 
        [get_key](auto lhs, auto rhs) {
            return get_key(lhs) < get_key(rhs);
        }
    );
}

struct Foo {
    std::string name;
    int id;
};

...

std::vector<Foo> foobar{ {"quux", 10000}, {"mumble", 12}, {"frobnicate", 42} };
sort_by_key(foobar.begin(), foobar.end(), [](const Foo& foo) {return foo.name; });
© www.soinside.com 2019 - 2024. All rights reserved.