#include <string>
#include <iostream>
#include <iomanip>
#include <list>
#include <chrono>
class muTimer
{
using Clock = std::chrono::high_resolution_clock;
bool active = false;
Clock::duration duration_;
Clock::time_point start_ = Clock::now(), stop_ = Clock::now();
muTimer(const muTimer&) = delete;
muTimer& operator=(const muTimer&) = delete;
public:
using ns = std::chrono::nanoseconds;
using mks = std::chrono::microseconds;
using ms = std::chrono::milliseconds;
muTimer() { reset(); start(); }
~muTimer() = default;
muTimer& reset()
{
duration_ = std::chrono::nanoseconds(0);
active = false;
return *this;
}
muTimer& start()
{
if (!active)
{
start_ = Clock::now();
active = true;
}
return *this;
}
muTimer& stop()
{
if (active)
{
stop_ = Clock::now();
duration_ += stop_ - start_;
active = false;
}
return *this;
}
template<typename T = mks>
unsigned long long duration()
{
return static_cast<unsigned long long>
(std::chrono::duration_cast<T>(stop_-start_).count());
}
};
using namespace std;
void kill(list<int>& l, size_t count)
{
list<int> tmp;
auto it = l.begin();
advance(it,count);
tmp.splice(tmp.begin(),l,l.begin(),it);
}
int main([[maybe_unused]] int argc,
[[maybe_unused]] const char * argv[])
{
list<int> L, M;
for(int i = 0; i < 1000000; ++i) { L.push_back(i); M.push_back(i); }
{
muTimer mt;
kill(L,5000);
mt.stop();
cout << "Kill for " << mt.duration<>() << "mks\n";
}
{
muTimer mt;
auto it = M.begin();
advance(it,5000);
M.erase(M.begin(),it);
mt.stop();
cout << "Erase for " << mt.duration<>() << "mks\n";
}
cout << (L == M) << endl;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxjaHJvbm8+CgpjbGFzcyBtdVRpbWVyCnsKICAgIHVzaW5nIENsb2NrID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CiAgICBDbG9jazo6ZHVyYXRpb24gICBkdXJhdGlvbl87CiAgICBDbG9jazo6dGltZV9wb2ludCBzdGFydF8gPSBDbG9jazo6bm93KCksIHN0b3BfID0gQ2xvY2s6Om5vdygpOwoKICAgIG11VGltZXIoY29uc3QgbXVUaW1lciYpICAgICAgICAgICAgID0gZGVsZXRlOwogICAgbXVUaW1lciYgb3BlcmF0b3I9KGNvbnN0IG11VGltZXImKSAgPSBkZWxldGU7CnB1YmxpYzoKICAgIHVzaW5nIG5zICAgICAgID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzOwogICAgdXNpbmcgbWtzICAgICAgPSBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzOwogICAgdXNpbmcgbXMgICAgICAgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzOwogICAgbXVUaW1lcigpIHsgcmVzZXQoKTsgc3RhcnQoKTsgfQogICAgfm11VGltZXIoKSA9IGRlZmF1bHQ7CiAgICBtdVRpbWVyJiByZXNldCgpCiAgICB7CiAgICAgICAgZHVyYXRpb25fID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKDApOwogICAgICAgIGFjdGl2ZSAgICA9IGZhbHNlOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIG11VGltZXImIHN0YXJ0KCkKICAgIHsKICAgICAgICBpZiAoIWFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0XyA9IENsb2NrOjpub3coKTsKICAgICAgICAgICAgYWN0aXZlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgbXVUaW1lciYgc3RvcCgpCiAgICB7CiAgICAgICAgaWYgKGFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0b3BfICAgICAgPSBDbG9jazo6bm93KCk7CiAgICAgICAgICAgIGR1cmF0aW9uXyArPSBzdG9wXyAtIHN0YXJ0XzsKICAgICAgICAgICAgYWN0aXZlICAgICA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gbWtzPgogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkdXJhdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4KICAgICAgICAgICAgKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PFQ+KHN0b3BfLXN0YXJ0XykuY291bnQoKSk7CiAgICB9Cn07CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQga2lsbChsaXN0PGludD4mIGwsIHNpemVfdCBjb3VudCkKewogICAgbGlzdDxpbnQ+IHRtcDsKICAgIGF1dG8gaXQgPSBsLmJlZ2luKCk7CiAgICBhZHZhbmNlKGl0LGNvdW50KTsKICAgIHRtcC5zcGxpY2UodG1wLmJlZ2luKCksbCxsLmJlZ2luKCksaXQpOwp9CgoKaW50IG1haW4oW1ttYXliZV91bnVzZWRdXSBpbnQgYXJnYywKICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICBsaXN0PGludD4gTCwgTTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIHsgTC5wdXNoX2JhY2soaSk7IE0ucHVzaF9iYWNrKGkpOyB9CgogICAgewogICAgICAgIG11VGltZXIgbXQ7CiAgICAgICAga2lsbChMLDUwMDApOwogICAgICAgIG10LnN0b3AoKTsKICAgICAgICBjb3V0IDw8ICJLaWxsICBmb3IgIiA8PCBtdC5kdXJhdGlvbjw+KCkgPDwgIm1rc1xuIjsKICAgIH0KICAgIHsKICAgICAgICBtdVRpbWVyIG10OwogICAgICAgIGF1dG8gaXQgPSBNLmJlZ2luKCk7CiAgICAgICAgYWR2YW5jZShpdCw1MDAwKTsKICAgICAgICBNLmVyYXNlKE0uYmVnaW4oKSxpdCk7CiAgICAgICAgbXQuc3RvcCgpOwogICAgICAgIGNvdXQgPDwgIkVyYXNlIGZvciAiIDw8IG10LmR1cmF0aW9uPD4oKSA8PCAibWtzXG4iOwogICAgfQogICAgY291dCA8PCAoTCA9PSBNKSA8PCBlbmRsOwp9Cg==