通过赋值运算符在索引处插入std :: vector

时间:2012-08-30 19:36:23

标签: c++ stdvector

我是C ++的新手,我很好奇这是否是插入std :: vector的首选方式

std::vector<Object_I_madeup> myVector;

   void setAt(int x, Object_I_madeup o)
        {
            myVector[x] = o;

        } // set the array location at x  to be o.

我问,因为我看到很多关于使用push_back或高度混淆insert()的事情。这种类似Java的方式有效吗?我宁愿这样做......

5 个答案:

答案 0 :(得分:10)

myVector[x] = o;

仅在x < myVector.size()时才能明确定义。否则,它会调用undefined-behavior,因为在这种情况下,它会尝试访问向量范围之外的元素。

如果您想确保它也检查越界访问,请使用at()作为:

myVector.at(x) = o;

如果std::out_of_range,它将抛出x >= myVector.size()异常。所以你必须把这段代码放在try-catch块中!这里将详细讨论它们之间的区别。

答案 1 :(得分:2)

myVector[x] = o与使用myVector.push_back(o)(或使用insert)完全不同。因此,哪种方法是正确的取决于您要做的事情:

  • myVector[x] = o不会在向量中插入,而是将位置x的元素替换为o。因此vector的长度不会改变,之前位置x的值不再在vector中。如果myVector的长度不大于x,则会导致超出界限,从而导致未定义的行为
  • myVector.push_back(o)会在o的末尾插入myVector。因此,在此操作之后,vector的长度将增加1,myVector的最后一个元素将为o。尚未从myVector中删除任何值。
  • myVector.insert(i, o)会将o插入由迭代器i指定的任意位置。因此,向量的长度将增加1,"ith"元素(元素编号myVector.begin() - i)将为o

答案 2 :(得分:1)

仅当矢量的大小至少为x + 1时才有效。如果不是,那么您将无法访问它。

如果你声明这样的矢量:

std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10
                                           // and default-initialize its elements

然后您可以安全地访问索引0 - 9。 但是,示例中的向量是空的,但它还没有有效的索引。

答案 3 :(得分:1)

如果您没有尝试从其边界访问它,即矢量大小大于x,它将起作用。

答案 4 :(得分:1)

如果您正在寻找类似于Java的ArrayList.set()方法,可以通过

更紧密地完成
void setAt(int x, Object_I_madeup o)
{
    myVector.at(x) = o;
}

与Java版本非常相似,如果向量不够大,vector::at()将抛出异常。注意,这会生成一个对象的副本(实际上是两个,因为你也是通过值传递给函数)。