Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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