Thursday, March 24, 2011

Best way to copy a vector to a list in STL ?

Is iterating through the vector using an iterator and copying to a list the most optimal method of copying. Any recommendations?

From stackoverflow
  • Why would you iterate and not use the standard copy algorithm?

    std::copy( vector.begin(), vector.end(), std::back_inserter( list ) );
    
    workmad3 : Should be std::copy rather than stl::copy, but otherwise this is the preferred method when using iterators to copy.
  • You can try to use trickier things from the <algorithm> header, for example for_each or copy ... but they would amount to the same thing, in my opinion.

    workmad3 : for_each will amount to the same. Copy can be overloaded to provide much more efficient copy mechanics depending on the iterators provided, and is generally the preferred mechanism.
  • If you're making a new list, you can take advantage of a constructor that takes begin and end iterators:

    std::list<SomeType> myList(v.begin(), v.end());
    

    Kasprzol's answer is perfect if you have an existing list you want to append to.

  • Also see:
    http://stackoverflow.com/questions/421573/best-way-to-extract-a-subvector-from-a-vector

  • I like this suggestion for constructing a new list.

    std::list<SomeType> myList(v.begin(), v.end());
    

    But when appending to an existing list, the following may be optimal for small data sets. By "optimal", I mean that it is easiest to remember how to do and easiest to understand. (These are subjective statements, I'm sure it depends on how your brain is wired.)

    for ( unsigned i=0; i<v.size(); i++ ) myList.push_back(v[i]);
    

    Using iterators on vectors may be overly pedantic in many cases. Simple indexing usually works fine.

    Another thread addresses iterators vs. indices (here). In that thread, the taken answer basically preferred iterators because they are more generic. But if vectors are the most commonly used container type, I think it is reasonable to specialize this kind of simple algorithm.

0 comments:

Post a Comment