Re: What is the output of this program?
I made another post but it was full of bugs. This one compiles and runs
and is more what I had in mind:
#include <string>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <stdexcept>
#include <iostream>
void pushbacking( std::string& s, const std::string & source )
{
s.reserve( source.size() );
std::copy( source.begin(), source.end(), std::back_inserter( s ) );
}
void resizing( std::string & s, const std::string & source )
{
s.resize( source.size() );
std::copy( source.begin(), source.end(), s.begin() );
}
void test( std::string const& fName, void f( std::string&, const
std::string & ), const std::string & source )
{
std::clock_t const startTime = std::clock();
std::string s = "knurre, voff!";
f( s, source );
std::clock_t const endTime = std::clock();
double const duration =
double(endTime - startTime)/CLOCKS_PER_SEC;
std::cout << fName << ": " << duration << " seconds." << std::endl;
}
int main()
{
try
{
const std::string::size_type stringSize = 10000000; // or whatever
number
std::string source ( stringSize, '*' );
test( "pushbacking", pushbacking, source );
test( "resizing", resizing, source );
return EXIT_SUCCESS;
}
catch ( const std::exception & x )
{
std::cerr << "Whoops " << x.what() << '\n';
return EXIT_FAILURE;
}
}
On VC8 in release mode:
pushbacking: 1.313 seconds.
resizing: 0.015 seconds.
The point is that push_back requires bounds-checking at every iteration
and resizing does not. The only thing likely to be slow in resizing is
initialisation (which shouldn't be a major problem with std::string).
(Of course, using a std::string member function might be a better idea,
but can you always be certain that your collection is std::string?)
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]