![](/img/trans.png)
[英]Does `name_compare()` calls the default construction or the `operator()` of `class name_compare` in `sort(vs.begin(), vs.end(), name_compare());`?
[英]I wonder that if the temporary object(name_compare()) is passed by value or by reference to std::sort
我想知道临时对象(name_compare())是按值传递还是通过引用 std::sort 传递。
对于这个问题的任何提示,我将不胜感激。
struct Record {
string name;
// ...
};
struct name_compare { // compare Records using "name" as the key
bool operator()(const Record& a, const Record& b) const
{ return a.name<b.name; }
};
void f(vector<Record>& vs)
{
sort(vs.begin(), vs.end(), name_compare());
// ...
}
std::sort
推导出Compare
类型并按值接受它:
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
在大多数情况下,这意味着按值接受比较器。
但这没关系,因为
operator()
,所以传递它实际上是一个空操作;在您的情况下, struct name_compare
没有成员,空的 object 也是如此。
可以通过将比较器类型包装在std::ref
中来强制扣除比较器类型作为参考。
顺便说一句,比较器不必是 class,也可以是static
或friend
function:
struct Record {
string name;
static bool compare(const Record& a, const Record& b) {
return a.name < b.name;
}
void f(vector<Record>& vs) {
sort(vs.begin(), vs.end(), Record::compare);
}
};
但更好的是,您可以依赖内置的std::less
实现并简单地为您的类型定义operator<
:
struct Record {
string name;
bool operator< (const Record& that) const {
return name < that.name;
}
void f(vector<Record>& vs) {
sort(vs.begin(), vs.end()); // operator < is used automatically
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.