Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > help understanding iterators with vector::insert

Reply
Thread Tools

help understanding iterators with vector::insert

 
 
pwalker
Guest
Posts: n/a
 
      07-31-2007
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


 
Reply With Quote
 
 
 
 
Neelesh Bodas
Guest
Posts: n/a
 
      07-31-2007
On Jul 31, 8:23 am, "pwalker" <(E-Mail Removed)> 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.


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


 
Reply With Quote
 
 
 
 
nallayan77@gmail.com
Guest
Posts: n/a
 
      07-31-2007
On Jul 31, 8:44 am, Neelesh Bodas <(E-Mail Removed)> wrote:
> On Jul 31, 8:23 am, "pwalker" <(E-Mail Removed)> 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.

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

 
Reply With Quote
 
Jim Langston
Guest
Posts: n/a
 
      07-31-2007
"pwalker" <(E-Mail Removed)> wrote in message
news:46aeaaf1$(E-Mail Removed)...
> 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 );


 
Reply With Quote
 
Bo Persson
Guest
Posts: n/a
 
      07-31-2007
Jim Langston wrote:
:: "pwalker" <(E-Mail Removed)> wrote in message
:: news:46aeaaf1$(E-Mail Removed)...
::: 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


 
Reply With Quote
 
Juha Nieminen
Guest
Posts: n/a
 
      07-31-2007
pwalker wrote:
> 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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
plain iterators and reverse iterators on vector subramanian100in@yahoo.com, India C++ 10 08-08-2009 08:28 AM
Understanding how to design STL-compatible iterators Christian Hackl C++ 4 11-29-2007 09:38 PM
Help with understanding 'show ip route' output John Smith Cisco 1 09-04-2005 01:15 AM
Iterators and reverse iterators Marcin Kaliciński C++ 1 05-08-2005 09:58 AM
containers iterators pointers. please help (urgent) progII C++ 1 04-02-2005 12:32 PM



Advertisments