【发布时间】:2012-03-15 18:19:36
【问题描述】:
我正在使用一些使用 std::vector 的类和实用方法。
现在我需要在其中一个类上使用每个帧的 pop_front - push_back 方法(但它们都是链接的,并且可以一起工作,所以我不能只更改一个)。
大部分操作都是遍历所有元素和 push_back 操作,所以我应该做的最好的工作是:派生这些类和实用程序的存储库,模板化所有内容,并使用双端队列或列表。
但这意味着大量的代码重写和大量的测试会让我错过最后期限。
所以我需要建议将有效的 pop_front 写入静态大小的向量(大小不会改变)。
我找到了here 一个方法:
template<typename T>
void pop_front(std::vector<T>& vec)
{
vec.front() = vec.back();
vec.pop_back();
vec.front() = vec.back(); // but should this work?
}
另外一个想法应该是:
template<typename T>
void pop_front(std::vector<T>& vec, already_allocated_vector vec1)
{
vec1.clear();
copy(vec.begin(), vec.end()-1, vec1.begin());
copy(vec1.begin(), vec1.end(), vec.begin());
}
这两种解决方案哪个更快?还有其他解决方案吗?
【问题讨论】:
-
“大小不会改变”是什么意思?做pop_front之后,向量会和以前一样大小吗?如果是这样,最后一个元素应该是垃圾吗?
-
向量具有相同的大小,因为在弹出后我突然进行了推送。每一帧我都用相同的方法弹出和推送,所以在此方法之前和之后,向量的大小相同
-
在担心速度之前,先担心正确性。如果你得到的结果完全是错误的,那么世界上所有的速度都毫无意义,而且据我所知,你的两个候选人都是错误的。第一个应命名为
pop_back_and_overwrite_front_with_penultimate,第二个应命名为invoke_undefined_behavior_and_pop_back。 (写到vec1.begin()是未定义的,因为vec1是空的;你需要写vec1.resize(vec.size() - 1)而不是vec1.clear()。)当我处理向量运算时,我有时会画一幅画。也许这对你也有帮助。 -
听说过
std::deque?和std::vector一样好,但可以pop_front() -
@SebastianMach 我也在寻找同样的东西。不像
std::vector,std::deque不是连续记忆。
标签: c++ vector data-structures