Re: Standard C++ Library
Razii wrote:
On Fri, 04 Apr 2008 00:39:22 +0200, Paul Brettschneider
<paul.brettschneider@yahoo.fr> wrote:
Anyway, a few changes and down to 750 ms from 6500 ms:
lol at "few" changes. I haven't tested it yet but I don't see <map> in
your version.
Sheesh... I'd thought it would be obvious that the code was a joke. :(
And of course you can write the same silly code with std::map. It's slower
then, but still 4-5 times faster than the original.
#include <iostream>
#include <fstream>
#include <ctime>
#include <map>
class Moron {
int count;
std::map<char, Moron *> morons;
public:
Moron() : count(0) {};
Moron *operator[](char c) {
std::map<char, Moron *>::iterator it = morons.find(c);
if(it != morons.end())
return it->second;
Moron *res = new Moron();
morons[c] = res;
return res;
};
void inc() {
++count;
};
void moronificator(const std::string &s) {
if(count)
std::cout << s << " " << count << std::endl;
for(std::map<char, Moron *>::iterator it = morons.begin();
it != morons.end(); ++it)
it->second->moronificator(s + std::string(1,
it->first));
};
};
int main(int argc, char **argv)
{
int w_total = 0, l_total = 0, c_total = 0;
const size_t bufsiz = 1024 * 1024;
char buf[bufsiz];
Moron m;
printf(" lines words bytes file\n" );
clock_t start=clock();
for(int i = 1; i <argc; ++i) {
std::ifstream input_file(argv[i]);
int w_cnt = 0, l_cnt = 0, c_cnt = 0;
Moron *act = &m;
for(;;) {
if(input_file.read(buf, bufsiz) &&
input_file.fail())
break;
int l = input_file.gcount();
if(!l)
break;
for(int j = 0; j < l; ++j) {
char c = buf[j];
if(c == '\n') {
++l_cnt;
}
if(c >= 'a' && c <= 'z' || c >= 'A' && c
<= 'Z') {
act = (*act)[c];
} else if(act != &m) {
++w_cnt;
act->inc();
act = &m;
}
++c_cnt;
}
}
if(act != &m) {
++w_cnt;
act->inc();
}
printf("%d\t%d\t%d\t %s\n", l_cnt, w_cnt, c_cnt, argv[i]);
l_total += l_cnt;
w_total += w_cnt;
c_total += c_cnt;
}
clock_t end=clock();
if(argc > 2) {
printf("--------------------------------------\n%d\t%d\t%d\t
total",
l_total, w_total, c_total);
}
printf("--------------------------------------\n");
m.moronificator(std::string());
std::cout <<"Time: " << double(end-start)/CLOCKS_PER_SEC * 1000 << "
ms\n";
}