Modernes C++ programmieren

Okt 23, 2024

lst-0791-book.cpp

// https://godbolt.org/z/ejMv4ohse 
#include <set>               // set, multiset
#include <unordered_set>     // unordered_set, unordered_multiset
#include <iostream>
#include <string>
#include <chrono>            // Zeitmessung
using std::cout;
using namespace std::chrono;

long long millisSeit(steady_clock::time_point start) {
    return duration_cast<milliseconds>(steady_clock::now()-start).count();
}
constexpr size_t ITERATIONS = 100'000;
template<typename Cont, typename Gen>
    requires std::invocable<Gen, size_t> &&  // C++20-Concept
    requires(Gen gen, size_t n) {{gen(n)} -> std::same_as<int>;} &&
    std::same_as<typename Cont::value_type,int>
void timeStuff(std::string name, Cont data, Gen genNum) {
    cout << name << "...";
    auto start = steady_clock::now();
    for(size_t idx=0; idx<ITERATIONS; ++idx) {
        data.insert( genNum(idx) );
    }
    cout << " " << millisSeit(start) << " ms" << std::endl;
}
int alleGleich(size_t) { return 7; }      // erzeugt immer die gleiche Zahl
int gestreut(size_t n) { return int(n); } // erzeugt unterschiedliche Zahlen
struct BadHash {  // die schlechtestmögliche Hashfunktion als Funktor
       size_t   operator()(int) const { return 1uz; }
};

int main() {
   std::multiset<int> m{};
   timeStuff("multiset           alleGleich        ", m, &alleGleich);
   timeStuff("multiset           gestreut          ", m, &gestreut);
   std::set<int> s{};
   timeStuff("set                alleGleich        ", s, &alleGleich);
   timeStuff("set                gestreut          ", s, &gestreut);
   std::unordered_multiset<int> um{};
   timeStuff("unordered_multiset alleGleich        ", um, &alleGleich);
   timeStuff("unordered_multiset gestreut          ", um, &gestreut);
   std::unordered_multiset<int,BadHash> umb{};
   timeStuff("unordered_multiset alleGleich badHash", umb, &alleGleich);
   timeStuff("unordered_multiset gestreut   badHash", umb, &gestreut);
}