我们正在使用比较器对象对 vector 进行排序:
std::vector<Data> v = ....
Comparator c = ....
std::sort(v.begin(), v,end(), c);
但是,这会在排序期间复制 c 并导致性能问题,因为 Comparator 对象存储了一个大映射(在调用比较函数时会在其中进行查找)。 我想我可以强制使用引用:
const Comparator &ref = c;
std::sort(v.begin(), v.end(), ref);
但复制仍然会发生。 有没有办法防止复制,或者我是否必须让 Comparator 只存储指向大量数据的指针? (我不认为我们可以在我们的编译器版本中使用 lambda/闭包)。
最佳答案
首先要注意的是,该标准对函数对象将完成多少拷贝提供的保证很少。如果您需要使用状态完整的函数,您应该使用引用语义(让仿函数指向状态,而不是保存在内部)。
话虽这么说,第一种选择是重构仿函数或包装它:
struct Wrapper {
Comparator *cmp;
Wrapper(Comparator *cmp) : cmp(cmp) {}
bool operator()(T const & lhs, T const & rhs) const {
return (*cmp)(lhs,rhs);
}
};
Comparator cmp(...);
Wrapper w(&cmp);
sort(v.begin(), v.end(), w);
这实际上与直接使用 std::ref
(C++11) 时得到的结果相同:
Comparator cmp(...);
sort(v.begin(), v.end(), std::ref(cmp));
关于c++ - 我可以阻止 std::sort 复制传递的比较对象吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695755/