#include <iostream>
#include <unordered_set>
#include <set>
#include <chrono>
#include <random>
using namespace std;
using namespace std::chrono;
auto prng = default_random_engine(random_device()());
uniform_int_distribution<int> dist(0, 4000);
int main()
{
vector<int> vec;
for (int i = 0; i < 4000; i++)
vec.emplace_back(dist(prng));
steady_clock::time_point stamp;
unordered_set<int> set1(4000);
stamp = steady_clock::now();
for (auto e : vec)
set1.emplace(e);
cout << (steady_clock::now() - stamp).count() << endl;
stamp = steady_clock::now();
for (auto e : vec)
set1.erase(e);
cout << (steady_clock::now() - stamp).count() << endl;
auto hash = [](int i) {return i; };
unordered_set<int, decltype(hash)> set2(4000, hash);
stamp = steady_clock::now();
for (auto e : vec)
set2.emplace(e);
cout << (steady_clock::now() - stamp).count() << endl;
stamp = steady_clock::now();
for (auto e : vec)
set2.erase(e);
cout << (steady_clock::now() - stamp).count() << endl;
cin.get();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHJhbmRvbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwphdXRvIHBybmcgPSBkZWZhdWx0X3JhbmRvbV9lbmdpbmUocmFuZG9tX2RldmljZSgpKCkpOwp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkaXN0KDAsIDQwMDApOwppbnQgbWFpbigpCnsKCXZlY3RvcjxpbnQ+IHZlYzsKCWZvciAoaW50IGkgPSAwOyBpIDwgNDAwMDsgaSsrKQoJCXZlYy5lbXBsYWNlX2JhY2soZGlzdChwcm5nKSk7CgoJc3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0YW1wOwoKCXVub3JkZXJlZF9zZXQ8aW50PiBzZXQxKDQwMDApOwoKCXN0YW1wID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKCWZvciAoYXV0byBlIDogdmVjKQoJCXNldDEuZW1wbGFjZShlKTsKCWNvdXQgPDwgKHN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFtcCkuY291bnQoKSA8PCBlbmRsOwoKCXN0YW1wID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKCWZvciAoYXV0byBlIDogdmVjKQoJCXNldDEuZXJhc2UoZSk7Cgljb3V0IDw8IChzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhbXApLmNvdW50KCkgPDwgZW5kbDsKCglhdXRvIGhhc2ggPSBbXShpbnQgaSkge3JldHVybiBpOyB9OwoJdW5vcmRlcmVkX3NldDxpbnQsIGRlY2x0eXBlKGhhc2gpPiBzZXQyKDQwMDAsIGhhc2gpOwoKCXN0YW1wID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKCWZvciAoYXV0byBlIDogdmVjKQoJCXNldDIuZW1wbGFjZShlKTsKCWNvdXQgPDwgKHN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFtcCkuY291bnQoKSA8PCBlbmRsOwoKCXN0YW1wID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKCWZvciAoYXV0byBlIDogdmVjKQoJCXNldDIuZXJhc2UoZSk7Cgljb3V0IDw8IChzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhbXApLmNvdW50KCkgPDwgZW5kbDsKCgljaW4uZ2V0KCk7CglyZXR1cm4gMDsKfQ==