c++ - 我可以阻止 std::sort 复制传递的比较对象吗

标签 c++ stl

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

相关文章:

C++ Visual Studio 2010 C4717 编译器警告在代码的一部分中,但在另一部分中没有

c++ - 以交替模式合并两个 STL vector

c++11 - 对<string,string>的删除赋值运算符的g++编译器错误

c++ - 对任意值类型的操作

c++ - 未知一口大小的模板整数

c++ - 在 Bison 中为 && 和 || 启动短路规则操作

C++11 std::unique_ptr 删除器

c++ - 是否可以将虚函数和函数对象混合使用 std 算法?

c++ - 使用什么数据结构来存储游戏对象的基于 2D 单元的 map ?

C++ STL : Container Recreation or Reuse after clearing?