Replace an element into a specific position of a vector

C++Visual C++VectorStlInsert

C++ Problem Overview


I want to replace an element into a specific position of a vector, can I just use an assignment:

// vec1 and 2 have the same length & filled in somehow
vec1;
vec2;

vec1[i] = vec2[i] // insert vec2[i] at position i of vec1

or I have to use insert():

vector<sometype>::iterator iterator = vec1.begin();

vec1.insert(iterator+(i+1), vec2[i]);

C++ Solutions


Solution 1 - C++

vec1[i] = vec2[i]

will set the value of vec1[i] to the value of vec2[i]. Nothing is inserted. Your second approach is almost correct. Instead of +i+1 you need just +i

v1.insert(v1.begin()+i, v2[i])

Solution 2 - C++

You can do that using at. You can try out the following simple example:

const size_t N = 20;
std::vector<int> vec(N);
try {
    vec.at(N - 1) = 7;
} catch (std::out_of_range ex) {
    std::cout << ex.what() << std::endl;
}
assert(vec.at(N - 1) == 7);

Notice that method at returns an allocator_type::reference, which is that case is a int&. Using at is equivalent to assigning values like vec[i]=....


There is a difference between at and insert as it can be understood with the following example:

const size_t N = 8;
std::vector<int> vec(N);
for (size_t i = 0; i<5; i++){
    vec[i] = i + 1;
}

vec.insert(vec.begin()+2, 10);

If we now print out vec we will get:

1 2 10 3 4 5 0 0 0

If, instead, we did vec.at(2) = 10, or vec[2]=10, we would get

1 2 10 4 5 0 0 0

Solution 3 - C++

See an example here: http://www.cplusplus.com/reference/stl/vector/insert/ eg.:




...
vector::iterator iterator1;




iterator1= vec1.begin();
vec1.insert ( iterator1+i , vec2[i] );




// This means that at position "i" from the beginning it will insert the value from vec2 from position i


Your first approach was replacing the values from vec1[i] with the values from vec2[i]

Solution 4 - C++

Don't use std::vector::insert if you want to use reserved memory and don't want to change the size of your buffer, try to use memcpy instead as below:

auto begin = static_cast<const uint8_t*>(data);
memcpy(&data_buffer[write_pos], begin, size);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondaiyueView Question on Stackoverflow
Solution 1 - C++Armen TsirunyanView Answer on Stackoverflow
Solution 2 - C++Pantelis SopasakisView Answer on Stackoverflow
Solution 3 - C++virlan2004View Answer on Stackoverflow
Solution 4 - C++shoujiang maView Answer on Stackoverflow