#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <list>
#include <algorithm>
#include <iterator>
#include <chrono>
using namespace std;
list<int> copy1(const vector<int>& src)
{
return list<int>(src.begin(), src.end());
}
list<int> copy2(const vector<int>& src)
{
list<int> dest;
copy(src.begin(), src.end(), back_inserter(dest));
return dest;
}
list<int> copy3(const vector<int>& src)
{
list<int> dest;
dest.insert(dest.begin(), src.begin(), src.end());
return dest;
}
list<int> copy4(const vector<int>& src)
{
list<int> dest;
dest.assign(src.begin(), src.end());
return dest;
}
list<int> copy5(const vector<int>& src)
{
list<int> dest;
for (const int &i: src) {
dest.push_back(i);
}
return dest;
}
int test(const vector<int>& v, list<int> (*cop)(const vector<int>&), const char * name)
{
using Clock = std::chrono::high_resolution_clock;
Clock::time_point start_ = Clock::now(), stop_;
list<int> d = cop(v);
stop_ = Clock::now();
cout << name << ": " <<
chrono::duration_cast<chrono::milliseconds>(stop_-start_).count() << endl;
return *d.begin();
}
int main(unsigned long long argc, const char * argv[])
{
vector<int> v(13421779);
test(v,copy1, "copy1");
test(v,copy2, "copy2");
test(v,copy3, "copy3");
test(v,copy4, "copy4");
test(v,copy5, "copy5");
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGNocm9ubz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpsaXN0PGludD4gY29weTEoY29uc3QgdmVjdG9yPGludD4mIHNyYykKewogICAgcmV0dXJuIGxpc3Q8aW50PihzcmMuYmVnaW4oKSwgc3JjLmVuZCgpKTsKfQoKbGlzdDxpbnQ+IGNvcHkyKGNvbnN0IHZlY3RvcjxpbnQ+JiBzcmMpCnsKICAgIGxpc3Q8aW50PiBkZXN0OwogICAgY29weShzcmMuYmVnaW4oKSwgc3JjLmVuZCgpLCBiYWNrX2luc2VydGVyKGRlc3QpKTsKICAgIHJldHVybiBkZXN0Owp9Cmxpc3Q8aW50PiBjb3B5Myhjb25zdCB2ZWN0b3I8aW50PiYgc3JjKQp7CiAgICBsaXN0PGludD4gZGVzdDsKICAgIGRlc3QuaW5zZXJ0KGRlc3QuYmVnaW4oKSwgc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CiAgICByZXR1cm4gZGVzdDsKfQpsaXN0PGludD4gY29weTQoY29uc3QgdmVjdG9yPGludD4mIHNyYykKewogICAgbGlzdDxpbnQ+IGRlc3Q7CiAgICBkZXN0LmFzc2lnbihzcmMuYmVnaW4oKSwgc3JjLmVuZCgpKTsKICAgIHJldHVybiBkZXN0Owp9CgpsaXN0PGludD4gY29weTUoY29uc3QgdmVjdG9yPGludD4mIHNyYykKewogICAgbGlzdDxpbnQ+IGRlc3Q7CiAgICBmb3IgKGNvbnN0IGludCAmaTogc3JjKSB7CiAgICAgICAgZGVzdC5wdXNoX2JhY2soaSk7CiAgICB9CiAgICByZXR1cm4gZGVzdDsKfQoKaW50IHRlc3QoY29uc3QgdmVjdG9yPGludD4mIHYsIGxpc3Q8aW50PiAoKmNvcCkoY29uc3QgdmVjdG9yPGludD4mKSwgY29uc3QgY2hhciAqIG5hbWUpCnsKICAgIHVzaW5nIENsb2NrID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKICAgIENsb2NrOjp0aW1lX3BvaW50IHN0YXJ0XyA9IENsb2NrOjpub3coKSwgc3RvcF87CgogICAgbGlzdDxpbnQ+IGQgPSBjb3Aodik7CgogICAgc3RvcF8gPSBDbG9jazo6bm93KCk7CgogICAgY291dCA8PCBuYW1lIDw8ICI6ICIgPDwKICAgICAgICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0b3BfLXN0YXJ0XykuY291bnQoKSA8PCBlbmRsOwogICAgcmV0dXJuICpkLmJlZ2luKCk7Cn0KCmludCBtYWluKHVuc2lnbmVkIGxvbmcgbG9uZyBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICB2ZWN0b3I8aW50PiB2KDEzNDIxNzc5KTsKCiAgICB0ZXN0KHYsY29weTEsICJjb3B5MSIpOwogICAgdGVzdCh2LGNvcHkyLCAiY29weTIiKTsKICAgIHRlc3Qodixjb3B5MywgImNvcHkzIik7CiAgICB0ZXN0KHYsY29weTQsICJjb3B5NCIpOwogICAgdGVzdCh2LGNvcHk1LCAiY29weTUiKTsKfQ==