5

我是 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 的方式有效吗?我宁愿那样做...

4

5 回答 5

11
myVector[x] = o;

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

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

myVector.at(x) = o;

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

于 2012-08-30T19:37:59.900 回答
2

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

  • myVector[x] = o不插入向量中,而是将位置处的元素替换xo. 因此, 的长度vector不会改变,并且之前位置的x值不再存在vector。如果 的长度myVector不是更大,那么x这将导致越界访问,从而导致未定义的行为
  • myVector.push_back(o)将插入omyVector. 因此,在此操作之后, 的长度vector将增加 1,而 的最后一个元素myVector将是o。没有从 中删除任何值myVector
  • myVector.insert(i, o)o在迭代器指定的任意位置插入i。因此向量的长度将增加一并且"ith"元素(元素编号myVector.begin() - i)将是o
于 2012-08-30T19:52:48.007 回答
1

仅当向量的大小至少为 x+1 时才有效。如果不是,则您正在越界访问它。

如果您像这样声明向量:

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

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

于 2012-08-30T19:37:24.923 回答
1

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

于 2012-08-30T19:41:35.170 回答
1

如果您正在寻找该ArrayList.set()方法的类似 java 的等效项,则可以通过以下方式进行更紧密的操作

void setAt(int x, Object_I_madeup o)
{
    myVector.at(x) = o;
}

很像 Java 版本,vector::at()如果向量不够大,会抛出异常。请注意,这会生成对象的副本(实际上是两个,因为您也将值传递给函数)。

于 2012-08-30T19:42:49.800 回答