Simple question; what’s better and why?
out.resize( in.size() ); T1::iterator outit = out.begin(); for( inIt = in.begin() to end, ++inIt, ++outIt ) *outit = *inIt OR out.erase(); for( inIt = in.begin() to end, ++inIt ) out.push_back( inIt );
I’m assuming the memory assignment implicit in push_back is worth avoiding but want to make sure.
Thanks
EDIT: Thanks for the out = in suggestions guys ;). The actual code I’m playing with is:
template//can't stop the browser ignoring th class T1, class T2 in angle brackets bool asciihex( T1& out, const T2& in ) { //out.erase(); out.resize( in.size() / 2 ); if( std::distance( in.begin(), in.end() ) % 2 )//use distance rather than size to minimise the requirements on T2? return false; for( T2::const_iterator it = in.begin(); it != in.end(); it += 2 ) { out.push_back(((( (*it > '9' ? *it - 0x07 : *it) - 0x30) '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f)); } return true; } template bool asciihex( T1& out, const T2& in ) { size_t size = in.size(); if( size % 2 )//use distance rather than size to minimise the requirements on T2? return false; out.resize( size / 2 ); T1::iterator outit = out.begin(); for( T2::const_iterator it = in.begin(); it != in.end(); it += 2, ++outit ) { *outit = ((( (*it > '9' ? *it - 0x07 : *it) - 0x30) '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f); } return true; }
Edit: I’ve marked push_back as the answer as it seems to be the consensus and, therefore, more useful to anyone else with the same problem. However I have ended up using the iterator method as one of the container classes I’m interested in doesn’t support push_back… mileage varies.
The second, and if you’re concerned about multiple extensions use out.reserve(). The right answer to adding to a vector is almost always push_back or back_inserter, which avoid some possible problems (exception guarantees, constructors, writing past the end, for example) that you’d have to pay attention to with other methods.