gpt4 book ai didi

c++ - 为什么我们在对自定义对象的 vector 进行排序时在结构定义中包含比较函数?

转载 作者:行者123 更新时间:2023-11-30 01:38:34 26 4
gpt4 key购买 nike

我们为什么要这样做:

struct MyStruct
{
int key;
std::string stringValue;

MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
{
return (struct1.key < struct2.key);
}
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));

std::sort(vec.begin(), vec.end(), less_than_key());

在上面的代码片段中,为什么 struct less_than_key 中包含 operator() 函数。如果我将它从结构定义中取出会发生什么?

最佳答案

What would happen if I take it out of the struct definition?

假设你聪明地做到了,没什么可怕的。您的示例可以很容易地重写为:

bool less_than_key(const MyStruct& s1, const MyStruct& s2)
{
return (s1.key < s2.key);
}

std::sort(vec.begin(), vec.end(), less_than_key);

但现在比较是通过间接调用完成的。该算法必须通过函数指针调用该函数。这可能更难内联。

另一方面,通过仿函数对象 的调用是静态解析的。编译器有更多的类型信息。它知道函数所属的类型。它直接解决调用。这可以更容易地内联。

不同之处在于编译器可以从给定的类型信息中收集多少信息。

此外,应该注意的是,您可以拥有以上所有内容,而无需为新类型选择名称。 C++11 引入了 lambda 表达式及其闭包类型。您可以轻松地将代码重写为这种惯用形式:

std::sort(vec.begin(), vec.end(), [](const MyStruct& s1, const MyStruct& s2){
return (s1.key < s2.key);
});

存在的类型信息与命名结构版本中的类型信息一样多。您只是省去了处理样板文件的麻烦,并开始在调用中嵌入比较标准以自行排序。

关于c++ - 为什么我们在对自定义对象的 vector 进行排序时在结构定义中包含比较函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47414302/

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