Inserting into a std::vector at an index via the assignment operator

感情迁移 提交于 2019-12-19 08:12:51

问题


I'm new to C++ and am curious if this is the preferred way of inserting into a 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.

I ask because I see a lot of things about using push_back,or the highly confusing insert(). Is this Java-like way valid? I'd much rather do that...


回答1:


myVector[x] = o;

It is well-defined only if x < myVector.size(). Otherwise, it invokes undefined-behavior, because in that case it attempts to access an element out of the bound of the vector.

If you want to make sure that it checks for out-of-bound-access also, then use at() as:

myVector.at(x) = o;

Now it will throw std::out_of_range exception if x >= myVector.size(). So you have to put this code in try-catch block! The difference between them is discussed at great detail here.

  • Why is using "vector.at(x)" better than "vector[x]" in C++?



回答2:


myVector[x] = o does something completely different from using myVector.push_back(o) (or using insert). Therefore which method is correct depends on what you are trying to do:

  • myVector[x] = o doesn't insert in the vector, but replaces the element at position x with o. Therefore the length of the vector doesn't change and the value which was previously at position x isn't in the vector any more. If the length of myVector wasn't bigger then x this will result in an out of bounds access, leading to undefined behaviour
  • myVector.push_back(o) will insert o at the end of myVector. Therefore after this operation the length of the vector will be increased by one and the last element of myVector will be o. No values have been removed from myVector.
  • myVector.insert(i, o) will insert o at an arbitrary position, specified by the iterator i. Therefore the length of the vector will be increased by one and the "ith" element (element number myVector.begin() - i) will be o



回答3:


It will work in case you are not trying to access it out of its bounds, i.e. vector size is greater than x.




回答4:


It's only valid if vector's size is at least x+1. If it's not, you're accessing it out of bounds.

If you declare the vector like this:

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

then you can safely access indexes 0 - 9. Your vector in the example is empty, though, there isn't yet a valid index to it.




回答5:


If you're looking for a java-like equivalent of the ArrayList.set() method, you can do it more closely via

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

Much like the Java version, vector::at() will throw an exception if the vector is not large enough. Note, this makes a copy of the object (actually, two, since you're also passing by value to the function).



来源:https://stackoverflow.com/questions/12204206/inserting-into-a-stdvector-at-an-index-via-the-assignment-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!