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
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).
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 behaviourmyVector.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
It will work in case you are not trying to access it out of its bounds, i.e. vector size is greater than x.
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.
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.