【发布时间】:2016-11-07 21:51:58
【问题描述】:
我必须临时处理和存储数据。目前我使用std::vector::push_back 添加数据和std::vector::erase 在达到最大元素时擦除元素。我的问题是我必须处理大量数据,并且当达到最大数量时,擦除似乎会影响性能。所以我决定每 y 毫秒添加一次数据并删除 x 个元素,作为优化。首先,我还在向量中保留了一定数量。我使用向量是因为我需要 const double *std::vector<T>::data() 函数将数据传递到其他地方,而且我不能进行任何转换/复制或任何事情。它必须要快。
std::vector<double> data;
size_t max; // there are millions of elements, e.g. 2000000
data.reserve(max);
// happens every x microseconds
void receive(double val) {
data.push_back(val);
}
// timed every x ms
void update() {
if (data.size() > max)
data.erase(data.begin(),data.end()+(data.size()-max));
}
我的问题是:如何提高效率?通过使用另一个容器?那么是否仍然可以将容器转换为const double *?
我刚刚意识到,我总是在这个设置下超过最大值,这可能是性能下降的原因吗?下面的代码能解决这个问题吗?
if (data.size() > max*0.8)
data.erase(data.begin(),data.begin()+(data.size()-max*0.8));
提前致谢!
【问题讨论】:
-
我做了,但它没有 const T *data() 函数,或者是吗?
-
您的要求让您陷入了困境。对于连续数据,您需要偶尔移动数据。
-
看来你在要求不可能的事情......如果你的要求是你有一个单一的平面缓冲区,那么没有办法从中间擦除而不向下移动上面的所有元素,这需要时间
-
我预计复制数据大约 10 次比复制一次需要更长的时间
标签: c++ performance vector