Re: What is the output of this program?
Alf P. Steinbach wrote:
Possibly you're talking about something entirely different than the
following program?
I actually had in mind something slightly different.
[include all the relevant headers]
void pushbacking( std::string& s, const std::string & source )
{
s.reserve( s.size() );
std::copy( source.begin(), source.end(), std::back_inserter( s ) );
}
void resizing( std::string & s, const std::string & source )
{
s.resize( s.size() );
std::copy( source.begin(), source.end(), s.begin() );
}
void test( std::string const& fName, void f( std::string&, const
std::string & ) )
{
std::clock_t const startTime = std::clock();
for( std::size_t i = 1; i <= ::nIterations; ++i )
{
std::string s = "knurre, voff!";
f( s );
}
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()
{
enum stringSize = 10000000; // or whatever number
try
{
std::string( source, "*", stringSize );
std::string target1;
test( source, target1, pushbacking );
test( source, target2, resizing );
return EXIT_SUCCESS;
}
catch ( const std::exception & x )
{
std::cerr << "Whoops " << x.what() << '\n';
return EXIT_FAILURE;
}
}
I will try this out at home on VC8 and if I get a chance I'll try it
out at work on UNIX with gcc3.2.1.
My theory is that the version that uses resize should be quicker
because back_inserter calls push_back which does bounds checking thus
it is bounds-checking around a million times. (Can anyone tell me how
push_back could be implemented without bounds-checking?).
(We can then try other functions that use std::string member functions
and see if they are even faster).
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]