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. std::vector myVector; 无效设置(int x,Object_I_madeup o) { myVector[x]=o; }//将x处的数组位置设置为o。
我问这个问题是因为我看到很多关于使用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. std::vector myVector; 无效设置(int x,Object_I_madeup o) { myVector[x]=o; }//将x处的数组位置设置为o。,c++,stdvector,C++,Stdvector,我问这个问题是因为我看到很多关于使用push_back,或者使用非常混乱的insert()。这种类似Java的方式有效吗?我更愿意这样做…只有向量的大小至少为x+1时才有效。如果它不是,那么你就无法访问它 如果像这样声明向量: std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10 // and
push_back
,或者使用非常混乱的insert()
。这种类似Java的方式有效吗?我更愿意这样做…只有向量的大小至少为x+1时才有效。如果它不是,那么你就无法访问它
如果像这样声明向量:
std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10
// and default-initialize its elements
std::vector myVector(10);//构造大小为10的向量
//并默认初始化其元素
然后您可以安全地访问索引0-9。
示例中的向量是空的,但是还没有有效的索引
myVector[x] = o;
只有当x
时,它才是定义良好的。否则,它将调用未定义的行为,因为在这种情况下,它将尝试访问向量边界之外的元素
如果要确保它也检查越界访问,请使用as:
现在,如果x>=myVector.size()
,它将抛出std::超出范围的异常。因此,您必须将此代码放入try catch
块中!这里详细讨论了它们之间的区别
如果您不试图访问超出其边界的向量,即向量大小大于x,它将起作用。如果您正在寻找类似java的ArrayList.set()方法的等价物,您可以通过
void setAt(int x, Object_I_madeup o)
{
myVector.at(x) = o;
}
与Java版本非常相似,如果向量不够大,vector::at()
将抛出异常。注意,这将创建对象的一个副本(实际上是两个,因为您也将值传递给函数) myVector[x]=o
与使用myVector完全不同。向后推(o)
(或使用insert
)。因此,哪种方法是正确的取决于您尝试执行的操作:
myVector[x]=o
不会插入到向量中,而是将位置x
处的元素替换为o
。因此,向量的长度
不会改变,先前位于位置x
的值不再位于向量
中。如果myVector
的长度不大于x
这将导致越界访问,导致未定义的行为
myVector。向后推(o)
将在myVector
的末尾插入o
。因此,在此操作之后,向量
的长度将增加1,myVector
的最后一个元素将是o
。未从myVector
中删除任何值
myVector.insert(i,o)
将在迭代器i
指定的任意位置插入o
。因此,向量的长度将增加1,并且第i个“
元素(元素编号myVector.begin()-i
)将为o
换句话说,如果索引无效,它不会为您调整向量大小。插入是什么意思?你的意思是在那个位置设置值吗?或者,您的意思是在该位置插入一个元素,替换其余元素?我发现您对insert的使用令人困惑……vector上的insert
API是否也会像at
API一样进行越界访问检查insert
API看起来很独特,因为它使用迭代器位置参数代替int位置参数。我不知道我是否真的可以创建一个迭代器w.r.t.向量的一个位置,它将超出它的边界。
void setAt(int x, Object_I_madeup o)
{
myVector.at(x) = o;
}