help understanding iterators with vector::insert

P

pwalker

Hi everyone,

I am trying to get my head around iterators used on vectors. Let's take the
code below:

-------------
std::vector<int> v1;
std::vector<int> v2;

v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );

v2.push_back( 10 );
v2.push_back( 20 );
v2.push_back( 30 );

v1.insert(v1.end(), v2.begin(), v2.begin());

for(int j = 0; j < v1.size(); j++)
std::cout << v1[j] << " ";
-------------

I'm confused why we dont get the output 1 2 3 10

Doesn't the insert method insert to the back of v1 everything between
v2.begin() and v2.begin(), which is namely 10?

I realise that to get the desired result I need to instead use
v1.insert(v1.end(), v2.begin(), v2.begin()+1) but i fail to understand the
logic in this.

I know that v2.begin() points to 10, and v2.end() (which is the same as
v2.begin()+3) points to one-beyond-30.

I guess all it comes down to is if I specify v1.insert(v1.end(), v2.begin(),
v2.begin()+N) it will append to the back of v1 (namely as position
one-beyond-3) the first N values of v2.

Any help on understanding this whole concept would be great!

Cheers,
Peter
 
N

Neelesh Bodas

Hi everyone,

I am trying to get my head around iterators used on vectors. Let's take the
code below:

-------------
std::vector<int> v1;
std::vector<int> v2;

v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );

v2.push_back( 10 );
v2.push_back( 20 );
v2.push_back( 30 );

v1.insert(v1.end(), v2.begin(), v2.begin());

for(int j = 0; j < v1.size(); j++)
std::cout << v1[j] << " ";
-------------

I'm confused why we dont get the output 1 2 3 10

Doesn't the insert method insert to the back of v1 everything between
v2.begin() and v2.begin(), which is namely 10?

I realise that to get the desired result I need to instead use
v1.insert(v1.end(), v2.begin(), v2.begin()+1) but i fail to understand the
logic in this.

In very simple terms, the version of vector::insert that you have used
takes 3 parameters:
param1: The position in vector where the insertion should take place
param2: The position of the first element in the range of elements to
be inserted
param3: The position of first element beyond the range of the elements
to be inserted.

In other words, for the insertion, the half-open interval is used :
[param2, param3)

-N
 
N

nallayan77

Hi everyone,
I am trying to get my head around iterators used on vectors. Let's take the
code below:
v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );
v2.push_back( 10 );
v2.push_back( 20 );
v2.push_back( 30 );
v1.insert(v1.end(), v2.begin(), v2.begin());
for(int j = 0; j < v1.size(); j++)
std::cout << v1[j] << " ";
-------------
I'm confused why we dont get the output 1 2 3 10
Doesn't the insert method insert to the back of v1 everything between
v2.begin() and v2.begin(), which is namely 10?
I realise that to get the desired result I need to instead use
v1.insert(v1.end(), v2.begin(), v2.begin()+1) but i fail to understand the
logic in this.

In very simple terms, the version of vector::insert that you have used
takes 3 parameters:
param1: The position in vector where the insertion should take place
param2: The position of the first element in the range of elements to
be inserted
param3: The position of first element beyond the range of the elements
to be inserted.

In other words, for the insertion, the half-open interval is used :
[param2, param3)

-N

Hi,

you need to have this
v1.insert(v1.end(), v2.begin(), v2.begin()+1);

instead of
v1.insert(v1.end(), v2.begin(), v2.begin());

to get the output 1 2 3 10

Thanks
 
J

Jim Langston

pwalker said:
Hi everyone,

I am trying to get my head around iterators used on vectors. Let's take
the code below:

-------------
std::vector<int> v1;
std::vector<int> v2;

v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );

v2.push_back( 10 );
v2.push_back( 20 );
v2.push_back( 30 );

v1.insert(v1.end(), v2.begin(), v2.begin());

for(int j = 0; j < v1.size(); j++)
std::cout << v1[j] << " ";
-------------

I'm confused why we dont get the output 1 2 3 10

Doesn't the insert method insert to the back of v1 everything between
v2.begin() and v2.begin(), which is namely 10?

I realise that to get the desired result I need to instead use
v1.insert(v1.end(), v2.begin(), v2.begin()+1) but i fail to understand the
logic in this.

I know that v2.begin() points to 10, and v2.end() (which is the same as
v2.begin()+3) points to one-beyond-30.

I guess all it comes down to is if I specify v1.insert(v1.end(),
v2.begin(), v2.begin()+N) it will append to the back of v1 (namely as
position one-beyond-3) the first N values of v2.

Any help on understanding this whole concept would be great!

Because the third paramater is one past the one to be inserted, the reason
being so you can use .end() which is one past the end of a container. Thsi
way we can code:

v1.insert( v1.end(), v2.begin(), v2.end() );
which is more common and not have to do
v1.insert( v1.end(), v2.begin(), v2.end() - 1 );
 
B

Bo Persson

Jim Langston wrote:
:: ::: Hi everyone,
:::
::: I am trying to get my head around iterators used on vectors.
::: Let's take the code below:
:::
::: -------------
::: std::vector<int> v1;
::: std::vector<int> v2;
:::
::: v1.push_back( 1 );
::: v1.push_back( 2 );
::: v1.push_back( 3 );
:::
::: v2.push_back( 10 );
::: v2.push_back( 20 );
::: v2.push_back( 30 );
:::
::: v1.insert(v1.end(), v2.begin(), v2.begin());
:::
::: for(int j = 0; j < v1.size(); j++)
::: std::cout << v1[j] << " ";
::: -------------
:::
::: I'm confused why we dont get the output 1 2 3 10
:::
::: Doesn't the insert method insert to the back of v1 everything
::: between v2.begin() and v2.begin(), which is namely 10?
:::
::: I realise that to get the desired result I need to instead use
::: v1.insert(v1.end(), v2.begin(), v2.begin()+1) but i fail to
::: understand the logic in this.
:::
::: I know that v2.begin() points to 10, and v2.end() (which is the
::: same as v2.begin()+3) points to one-beyond-30.
:::
::: I guess all it comes down to is if I specify v1.insert(v1.end(),
::: v2.begin(), v2.begin()+N) it will append to the back of v1
::: (namely as position one-beyond-3) the first N values of v2.
:::
::: Any help on understanding this whole concept would be great!
::
:: Because the third paramater is one past the one to be inserted,
:: the reason being so you can use .end() which is one past the end
:: of a container. Thsi way we can code:
::
:: v1.insert( v1.end(), v2.begin(), v2.end() );
:: which is more common and not have to do
:: v1.insert( v1.end(), v2.begin(), v2.end() - 1 );

And also, the first version works even if v2 is empty. The last one
does definitely not!


Bo Persson
 
J

Juha Nieminen

pwalker said:
Doesn't the insert method insert to the back of v1 everything between
v2.begin() and v2.begin(), which is namely 10?

There's nothing *between* v2.begin() and v2.begin(). It's a
zero-sized range, and thus contains nothing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top