在矢量末尾添加双端队列的最快方法?

时间:2015-09-30 21:32:44

标签: c++ vector deque

这个问题与速度有关。

我在openCV库中使用一个函数(在FaceRecognizer类中),它需要输入一个向量。我需要通过组合几个deque来构建这个向量。除了遍历双端队列并将每个元素推回到向量之外,还有更快的方法吗?

关于deque的一些信息:它是一个15个元素的双端队列,我不断推送它,如果它有16个元素我pop_front。订单很重要。

或者我可以将deque's更改为向量,如果这可能会加速所有内容,但据我所知,当我在向量大小达到16时删除向量的第一个元素时会很慢。

2 个答案:

答案 0 :(得分:3)

  

在矢量末尾添加双端队列的最快方法是什么?

可以在恒定时间内获取双端队列的大小(对于所有STL容器),然后在向量中保留空间以将内存管理开销限制为单个分配,最后将元素从双端队列中移出到向量中:

// std::vector v, std::deque d
v.reserve(v.size() + d.size());
std::move(std::begin(d), std::end(d), std::back_inserter(v));
d.clear(); // or reuse in some way

如果您打算将多个容器附加到向量,请立即考虑reserve所需的完整存储空间。

如果数据量巨大,请注意std::bad_alloc例外情况。在这种情况下,使用矢量的连续存储并不理想。

答案 1 :(得分:0)

您可以执行类似

的操作

queue / vector myItem;

// Swap the position to the back, if it's first use 0 if you like
myItem[position].swap(myItem.back());
myItem.pop_back();

当你从前面移开时,它不会重新分配整个列表。

相关问题