#include <map>
#include <algorithm>
#include <chrono>
#include <iostream>
#include <unordered_map>

template <class Func>
void timeit(const char* message, Func f) {
	auto start = std::chrono::system_clock::now();
	f();
	auto end = std::chrono::system_clock::now();
	std::chrono::duration<double> elapsed_seconds = end-start;
	std::cout << "Duration of " << message << " is " << 
		elapsed_seconds.count() << "\n";
}

void insert_dumb() {
	std::map<int, int> map;
	timeit ("dumb! insertion", 
		[&]() {
			for (int i = 0; i < 100000; ++i)
				map[i] = i;
		});
}
		
void insert_smart() {
	std::map<int, int> map;
	timeit ("smart insertion", 
		[&]() {
			for (int i = 0; i < 100000; ++i)
				map.insert(map.end(), {i, i});
		});
}

void insert_unord() {
	std::unordered_map<int, int> map;
	timeit ("unord insertion", 
		[&]() {
			for (int i = 0; i < 100000; ++i)
				map.insert({i, i});
		});
}

int main () {
	
	for (int i = 0; i < 5; ++i) {
		insert_dumb();
		insert_smart();
		insert_unord();
	}
}