我们正在使用比较器对象对 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);
但与此同时仍会发生复制。
有没有办法防止复制,还是我必须使比较器仅存储指向大量数据的指针? (我认为我们不能在我们的编译器版本中使用lambda/closures)。
最佳答案
首先要注意的是,对于功能对象要完成多少个拷贝,该标准几乎没有提供任何保证。如果需要使用全状态函数,则应使用引用语义(具有由仿函数指向的状态,而不是保留在内部)。
话虽这么说,第一种选择是重构仿函数或包装仿函数:
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/