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

后端 未结 5 1223
北恋
北恋 2021-01-13 06:17

I\'m new to C++ and am curious if this is the preferred way of inserting into a std::vector

std::vector myVector;

   void setAt(int x         


        
相关标签:
5条回答
  • 2021-01-13 06:49

    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).

    0 讨论(0)
  • 2021-01-13 06:55

    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
    0 讨论(0)
  • 2021-01-13 06:59

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

    0 讨论(0)
  • 2021-01-13 07:11
    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++?
    0 讨论(0)
  • 2021-01-13 07:11

    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.

    0 讨论(0)
提交回复
热议问题