C++排序向量<double>与在<Object>双成员变量上键控的向量
C++ sort vector<double> vs vector<Object> keyed on double member variable
我有一个自定义对象的向量,我正在排序,并注意到这种排序花费的时间比预期的要长。我决定进一步研究它,并从这种基准测试中调整了代码,而不是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比复制单个双重的时间还多。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 将图像加载到Mat-vvector<向量<垫子>>