我是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的方式有效吗?我宁愿这样做......
答案 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()
将抛出异常。注意,这会生成一个对象的副本(实际上是两个,因为你也是通过值传递给函数)。