combining two vectors

A

Alan

Is there an easy and efficient way to combine two <vector>s, rather
than taking each element from one and adding it to the other?

I haven`t been able to find any guidance on or examples of this
sort of operation.

Thanks, Alan
 
I

Ian Collins

Alan said:
Is there an easy and efficient way to combine two <vector>s, rather
than taking each element from one and adding it to the other?

I haven`t been able to find any guidance on or examples of this
sort of operation.

vector1.insert( vector1.end(), vector2.begin(), vector2.end() );
 
S

Stefan Naewe

Ian said:
vector1.insert( vector1.end(), vector2.begin(), vector2.end() );

It's easy - yes.
But is it really efficient ?
Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?

/S
 
P

Pete Becker

Stefan said:
It's easy - yes.
But is it really efficient ?
Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?

No. The iterators that represent the range being copied are random
access iterators, so insert can figure out how many elements will be
added and adjust the size accordingly. Repeatedly calling push_back
could end up reallocating the storage space more than once.

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)
 
S

Stefan Naewe

Pete said:
No. The iterators that represent the range being copied are random
access iterators, so insert can figure out how many elements will be
added and adjust the size accordingly. Repeatedly calling push_back
could end up reallocating the storage space more than once.

OK.
But what if I do a vector1.reserve(x) (with a valid x...) before ?
'vector2.end()-vector2.begin()' elements need to be copied after vector1.end(), right?

(Using std::list and std::list::splice() would be more efficient in this case, wouldn't it?)


/S
 
R

red floyd

Stefan said:
It's easy - yes.
But is it really efficient ?
Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?

Why does everyone ask "is this more efficient" in a vacuum?

Have you benchmarked to determine that your vector operations are the
bottleneck? An "efficient" program that doesn't work right is not as
good as an "inefficient" program that does.

Hoare's Law (also attributed to Knuth): "Premature optimization is the
root of all evil".
 
P

Pete Becker

red said:
Why does everyone ask "is this more efficient" in a vacuum?

Have you benchmarked to determine that your vector operations are the
bottleneck? An "efficient" program that doesn't work right is not as
good as an "inefficient" program that does.

And how is changing from push_back to insert going to make this code not
work right?
Hoare's Law (also attributed to Knuth): "Premature optimization is the
root of all evil".

Okay, let's all use bubble sort until we can prove that quicksort will
be a better choice.

Sometimes optimization without measurement is perfectly appropriate.
When there's a choice of two ways to do something and one is slower,
choose the other.

for (iter = vector2.begin(); iter != vector2.end(); ++iter)
vector1.push_back(*iter);

versus

vector1.insert(vector1.end(), vector2.begin(), vector2.end());

No contest. Use the latter.

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)
 
I

Ian Collins

Pete said:
And how is changing from push_back to insert going to make this code not
work right?



Okay, let's all use bubble sort until we can prove that quicksort will
be a better choice.

Sometimes optimization without measurement is perfectly appropriate.
When there's a choice of two ways to do something and one is slower,
choose the other.
Agreed, maybe the quote should be changed to "Premature
micro-optimisation is the root of all evil" to differentiate between
code tweaks and choice of algorithm.
 
A

Alf P. Steinbach

* Ian Collins:
Agreed, maybe the quote should be changed to "Premature
micro-optimisation is the root of all evil" to differentiate between
code tweaks and choice of algorithm.

Isn't that an optimization?
 

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,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top