C++排序向量<double>与在<Object>双成员变量上键控的向量

C++ sort vector<double> vs vector<Object> keyed on double member variable

本文关键字:gt 向量 lt 变量 成员 与在 排序 double C++ Object      更新时间:2023-10-16

我有一个自定义对象的向量,我正在排序,并注意到这种排序花费的时间比预期的要长。我决定进一步研究它,并从这种基准测试中调整了代码,而不是vector<double>,而是对vector<Foo>进行排序。结果是,按照原始基准代码中的boost::chrono::steady_clock测量,对自定义对象的向量进行排序大约需要2.5倍。这对我来说并没有意义,因为键是相同的,并且时间分类已经开始分配。为什么这是这样的,这会影响这样的向量上的其他操作,例如binary_search?

class Foo {
public:
  double _barKey;
  string _barStr1;
  string _barStr2;
  string _barStr3;
  int _barInt;
  Foo(double bk, string bs1, string bs2, string bs3);
};
  Foo::Foo(double bk, string bs1 = "", string bs2 = "", string bs3 = "") {
    _barKey = bk;
    _barStr1 = bs1;
    _barStr2 = bs2;
    _barStr3 = bs3;
    _barInt = 0;
}
struct less_than_key {
    inline bool operator() (const Foo& lhs, const Foo& rhs)
    {
        return (lhs._barKey < rhs._barKey);
    }
};
....
std::sort(std::begin(V), std::end(V), less_than_key());

使用:

编译
g++ -O2 -std=c++11 sort_object_bench.cpp -lboost_chrono -lboost_system -o gcc_test

这对我来说并不重要,因为钥匙是相同的, 时间分类开始分配内存。

差异不是由于进行分配。分类时向量的大小不会改变,因此没有分配。但是,sort必须复制周围的元素才能将它们放在正确的位置。而且,复制双重,3个字符串和一个int比复制单个双重的时间还多。