我们正在使用比较器对象对 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/

10-13 06:18