插入矢量

时间:2012-09-28 15:46:38

标签: c++ stl vector insertion

我是否正确地认为这种无辜的代码相当危险?

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()));
}

2 个答案:

答案 0 :(得分:2)

对我来说似乎也很危险,因为vector.back()会返回引用,而

  

通过将位置和矢量末尾之间的所有元素移动到新位置,然后插入新元素来执行向量末端以外的位置上的插入   (来自here

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

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

答案 1 :(得分: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());
}

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