4

我是否认为这个看似无辜的代码相当危险?

template<typename T>
void insertLast(std::vector<T>& v)
{
    if(v.empty()) return;  
    v.insert(v.begin(), v.back());
}

阅读一些答案后的一些澄清..

好吧,我并不是真的在问如何将一个元素插入到向量中,而是我做了一个虚拟的情况来质疑一个原则。换句话说,你认为有必要制作一个副本吗(这里创建了一个临时的.. 和一个 const保证对临时的引用):

template<typename T>
void insertLast(std::vector<T>& v)
{
    if(v.empty()) return;  
    v.insert(v.begin(), T(v.back()));
}
4

2 回答 2

2

这对我来说似乎也很危险,因为 vector.back() 返回参考,并且

通过将位置和向量末尾之间的所有元素移动到它们的新位置,然后插入新元素(从这里开始)来执行除向量末端以外的位置上的插入

除非我误解了,否则传递给的引用将insert变为“无效”(如果没有发生重新分配,它不能包含最后一个元素,而是前一个元素;否则它仍然可能是正确的,但我想它不能保证。

在某些情况下,某些优化器可能会隐藏错误(我猜它永远不会发生在对象上,但可能会发生在原语上),所以你会得到预期的结果,但总的来说我不会依赖这种行为。

于 2012-09-28T16:00:35.620 回答
1

假设您解决了注释中提到的两点以进行编译,这将运行但每次运行时都会在向量的前面留下一个垃圾值,因为 vector.back() 返回一个引用

看起来这试图做的是以下内容:

template<typename T>
void insertLast(std::vector<T>& v)
{
    if(v.empty()) return;  
    v.insert(v.begin(), v.end() - 1, v.end());
}

这将安全地插入向量中的最后一个元素,使其也是第一个元素....假设这是所需的行为。

于 2012-09-28T15:56:51.993 回答