我正在使用一些类和多个实用方法,它们使用 std::vector。现在我需要在这些类中的一个上每帧使用 pop_front - push_back 方法(但它们都是链接的,共同工作,所以我不能只更改一个)。大多数操作都是迭代所有元素和 push_back 操作,因此我应该做的最好的工作是:fork 这些类和实用程序的存储库,将所有内容模板化,并使用 deque 或 list。但这意味着要重写大量代码并进行大量测试,这将使我错过截止日期。因此,我需要建议如何对静态大小的向量编写有效的 pop_front(大小不会更改)。我在这里找到了一种方法:
这两个解决方案中哪个更快?还有其他的解决方案吗?
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_back_and_overwrite_front_with_penultimate
,第二个应该被命名为invoke_undefined_behavior_and_pop_back
。(在向vec1.begin()
写入内容时行为是未定义的,因为vec1
是空的;你需要写成vec1.resize(vec.size() - 1)
而不是vec1.clear()
)。当我处理向量操作时,有时我会画个图,也许这对你有帮助。 - Rob Kennedystd::deque
吗?它和std::vector
一样好用,但可以使用pop_front()
函数。 - Sebastian Machstd::vector
不同,std::deque
不是连续的内存。 - JustWe