#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <sys/time.h>
#include <vector>
#include <set>
#include <unordered_set>
#include <string>
#include <iostream>
#include <algorithm>

int main(int argc,char**argv,char**envp)
{
    struct timespec t2, t3;  double t; int f1,f2,f3;
    std::vector<std::string> v;
    std::set<std::string> s;
    std::unordered_set<std::string> us;
    
	std::cout << "insert:\n";
    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i)for (char **p=envp;*p;++p) v.push_back(*p);
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("vec %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i)for (char **p=envp;*p;++p) s.insert(*p);
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("set %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i)for (char **p=envp;*p;++p) us.insert(*p);
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("uos %f\n", t);

	std::cout << v.size() << "\n" << s.size() << "\n" << us.size() << "\n";
	v.clear();for (char **p=envp;*p;++p) v.push_back(*p);
	std::cout << "\nfind(6):\n";

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f1=find(v.begin(),v.end(),envp[2])!=v.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("vec %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f2=s.find(envp[2])!=s.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("set %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f3=us.find(envp[2])!=us.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("uos %f\n", t);
	
	std::cout << v.size() << s.size() << us.size() << f1 << f2 << f3;
	
	v.clear();for(int i=100;i;--i){for (char **p=envp;*p;++p) v.push_back(*p+std::to_string(i));}
	s.clear();for(int i=100;i;--i){for (char **p=envp;*p;++p) s.insert(*p+std::to_string(i));}
	us.clear();for(int i=100;i;--i){for (char **p=envp;*p;++p) us.insert(*p+std::to_string(i));}
	std::cout << "\n\nfind(600):\n";

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f1=find(v.begin(),v.end(),envp[2])!=v.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("vec %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f2=s.find(envp[2])!=s.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("set %f\n", t);

    clock_gettime(CLOCK_MONOTONIC,  &t2);
    for(int i=100000;i;--i) f3=us.find(envp[2])!=us.end();
    clock_gettime(CLOCK_MONOTONIC,  &t3);
    t = (t3.tv_sec - t2.tv_sec) *1000 + (t3.tv_nsec - t2.tv_nsec) / 1000000.; printf("uos %f\n", t);
	
	std::cout << v.size() << s.size() << us.size() << f1 << f2 << f3;
    return 0;
}

