#include #include #include #include #include #include #include #include #ifdef HAVE_BOOST #include #define hash_set boost::unordered_set #else #ifdef _MSC_VER #include #define hash_set std::unordered_set #else #include #define hash_set std::tr1::unordered_set #endif #endif #include "cycle.h" void PrintStats(std::vector timings) { std::cout << std::fixed << std::setprecision(2); std::cout << "["; for (size_t i = 1 ; i& invec, size_t n=7) { std::vector timings; timings.reserve(n); for (size_t i=0 ; i vec(invec); ticks start = getticks(); std::sort(vec.begin(), vec.end()); vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); ticks end = getticks(); double timed = elapsed(end, start); timings.push_back(timed); } std::cout << "SortUniq(" << invec.size() << "," << n << "): "; PrintStats(timings); std::cout << std::endl; } void Set(std::vector& invec, size_t n=7) { std::vector timings; timings.reserve(n); for (size_t i=0 ; i vec(invec); std::set st; ticks start = getticks(); st.insert(vec.begin(), vec.end()); ticks end = getticks(); double timed = elapsed(end, start); timings.push_back(timed); } std::cout << "Set(" << invec.size() << "," << n << "): "; PrintStats(timings); std::cout << std::endl; } void HashSet(std::vector& invec, size_t n=7) { std::vector timings; timings.reserve(n); for (size_t i=0 ; i vec(invec); hash_set st; std::set sh; ticks start = getticks(); st.insert(vec.begin(), vec.end()); sh.insert(st.begin(), st.end()); ticks end = getticks(); double timed = elapsed(end, start); timings.push_back(timed); } std::cout << "HashSet(" << invec.size() << "," << n << "): "; PrintStats(timings); std::cout << std::endl; } int main() { srand(static_cast(time(0))); std::vector vec; vec.reserve(10000000); vec.clear(); for (size_t i = 0 ; i<10000 ; ++i) { vec.push_back(rand()%1000); } SortUniq(vec); Set(vec); HashSet(vec); std::cout << std::endl; vec.clear(); for (size_t i = 0 ; i<100000 ; ++i) { vec.push_back(rand()%1000); } SortUniq(vec); Set(vec); HashSet(vec); std::cout << std::endl; vec.clear(); for (size_t i = 0 ; i<1000000 ; ++i) { vec.push_back(rand()%1000); } SortUniq(vec); Set(vec); HashSet(vec); std::cout << std::endl; vec.clear(); for (size_t i = 0 ; i<10000000 ; ++i) { vec.push_back(rand()%1000); } SortUniq(vec); Set(vec); HashSet(vec); std::cout << std::endl; }