size_t hash1( const std::string& s ) { std::string ns = s; makelowercase(ns); std::hash< std::string > str_hash; return str_hash(ns); }
Var value_compare(Var a, Var b) { char *sa=0, *sb=0; Var r; if(a.type != b.type) { r.type = TYPE_ERR; r.v.err = E_TYPE; return r; } switch(a.type) { case TYPE_STR: sa=str_dup(a.v.str); sb=str_dup(b.v.str); makelowercase(sa); makelowercase(sb); r.v.num = strcmp(sa, sb); free(sa); free(sb); r.type = TYPE_INT; break; case TYPE_INT: case TYPE_FLOAT: r = compare_numbers(a,b); break; case TYPE_OBJ: case TYPE_ERR: a.type = b.type = TYPE_INT; r = compare_numbers(a,b); break; default: r.v.err = E_TYPE; r.type = TYPE_ERR; } return r; }
int main( int argc, char* argv [] ) { std::vector< std::string > vect; // This use of int is one of those ugly remainders of C--. for( int i = 1; i != argc; ++ i ) { std::ifstream input{ argv[i] }; if( !input ) { std::cerr << "could not open input file " << argv[i] << "\n"; } else { readfile( input, vect ); } } makelowercase( vect ); std::cout << vect << "\n"; std::list< std::string > lst = makelist( vect ); auto t1 = std::chrono::high_resolution_clock::now( ); vectortest::sort( vect ); //listtest::sort(lst); auto t2 = std::chrono::high_resolution_clock::now( ); std::chrono::duration< double > d = ( t2 - t1 ); std::cout << vect << "\n"; std::cout << "sorting took " << d. count( ) << " seconds\n"; return 0; }
void makelowercase( std::vector< std::string > & vect ) { for( auto& s : vect ) makelowercase(s); }
int main() { std::map< std::string,unsigned int > freq1; std::map< std::string,unsigned int > freq2; std::map< std::string,unsigned int > freq3; std::unordered_map< std::string, unsigned int > f1; std::unordered_map< std::string, unsigned int > f2; std::unordered_map< std::string, unsigned int > f3; std::vector< std::string > v; std::vector< std::string > v1; std::fstream file("3.html"); readfile(file,v); readfile(file,v1); auto t11 = std::chrono::high_resolution_clock::now( ); freq1 = frequencytable(v); auto t12 = std::chrono::high_resolution_clock::now( ); f1 = hash_frequencytable(v); auto t13 = std::chrono::high_resolution_clock::now( ); readfile(file,v); auto t21 = std::chrono::high_resolution_clock::now( ); freq2 = frequencytable(v); auto t22 = std::chrono::high_resolution_clock::now( ); f3 = hash_frequencytable(v); auto t23 = std::chrono::high_resolution_clock::now( ); readfile(file,v); auto t31 = std::chrono::high_resolution_clock::now( ); freq3 = frequencytable(v); auto t32 = std::chrono::high_resolution_clock::now( ); f3 = hash_frequencytable(v); auto t33 = std::chrono::high_resolution_clock::now( ); std::chrono::duration< double > d1 = ( t12 - t11 ); std::chrono::duration< double > d2 = ( t22 - t21 ); std::chrono::duration< double > d3 = ( t32 - t31 ); std::chrono::duration< double > d4 = ( t13 - t12 ); std::chrono::duration< double > d5 = ( t23 - t22 ); std::chrono::duration< double > d6 = ( t33 - t32 ); std::cout << "for map:\n 1*3.html = " << d1.count() << "\n 2*3.html = " << d2.count() << "\n 3*3.html = " << d3.count() << " seconds\n"; std::cout << "for unordered_map:\n 1*3.html = " << d4.count() << "\n 2*3.html = " << d5.count() << "\n 3*3.html = " << d6.count() << " seconds\n"; auto cmp = [] ( const std::string& s1, const std::string& s2 ) { size_t m = s1.length() < s2.length() ? s1.length() : s2. length( ); for(size_t i = 0;i < m; i++) { int a = tolower(s1[i]); int b = tolower(s2[i]); if(a != b) return a < b; } return s1.length() < s2.length(); }; auto hash = [] ( const std::string& s ) { std::string ns = s; makelowercase(ns); std::hash< std::string > str_hash; return str_hash(ns); }; auto equal = []( const std::string& s1, const std::string& s2 ) { if(s1.length() != s2.length()) return false; size_t m = s1.length() < s2.length() ? s1.length() : s2. length( ); for(size_t i = 0;i < m; i++) { int a = tolower(s1[i]); int b = tolower(s2[i]); if(a != b) return false; } return true; }; auto m1 = nfrequencytable(v1, cmp); auto m2 = nhash_frequencytable(v1,hash,equal); std::cout << most_frequent(freq1); //std::cout << m1; //std::cout << m2; auto m3 = nfrequencytable < bool (*) ( const std::string& s1, const std::string& s2 ) > (v1,cmp1); auto m4 = nhash_frequencytable < size_t (*) (const std::string& s), bool (*) ( const std::string& s1, const std::string& s2 ) > (v1,hash,equal); //std::cout << m3; //std::cout << m4; file.close(); return 0; }