我们使用比较器对象对矢量进行排序:
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 / closures。)
答案 0 :(得分:10)
首先要注意的是,标准对于为函数对象执行的副本数量提供的保证非常少。如果你需要使用状态完整函数,你应该使用引用语义(让函子指向状态,而不是保持在里面)。
话虽这么说,第一种选择是重构仿函数或包装它:
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));