#include <iostream>
#include <deque>
#include <list>
#include <iterator>
#include <chrono>
#include <iomanip>
#include <string>
#include <thread>
template <class C>
int EraseMiddle(std::size_t size)
{
C container(size);
auto start = std::chrono::system_clock::now();
auto it = std::begin(container);
std::advance( it, size/2 );
container.erase( it );
return std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::system_clock::now() - start ).count();
}
template <class T>
void MeasureForType()
{
std::cout << std::setw(10) << "size" << std::setw(10) << "list" << std::setw(10) << "deque\n";
std::cout << std::string(30,'-') << std::endl;
for( std::size_t size = 1; size < 10000001; size *= 10 )
{
std::cout << std::setw(10) << size <<
std::setw(10) << EraseMiddle<std::list<T>>(size) <<
std::setw(10) << EraseMiddle<std::deque<T>>(size) << std::endl;
}
}
class C
{
public:
C& operator=( const C& c )
{
std::this_thread::sleep_for( std::chrono::microseconds(1));
return *this;
}
C& operator= (C&& c)
{
ptr = c.ptr; // не совсем мгновенно
c.ptr = nullptr;
return *this;
}
private:
void* ptr;
};
int main() {
// MeasureForType<char>();
MeasureForType<C>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dGhyZWFkPgogCnRlbXBsYXRlIDxjbGFzcyBDPgppbnQgRXJhc2VNaWRkbGUoc3RkOjpzaXplX3Qgc2l6ZSkKewogICAgQyBjb250YWluZXIoc2l6ZSk7CiAgICAKICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKIAogICAgYXV0byBpdCA9IHN0ZDo6YmVnaW4oY29udGFpbmVyKTsKICAgIHN0ZDo6YWR2YW5jZSggaXQsIHNpemUvMiApOwogICAgY29udGFpbmVyLmVyYXNlKCBpdCApOwogCiAgICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpIC0gc3RhcnQgKS5jb3VudCgpOwp9CiAKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQgTWVhc3VyZUZvclR5cGUoKQp7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KDEwKSA8PCAic2l6ZSIgPDwgc3RkOjpzZXR3KDEwKSA8PCAibGlzdCIgPDwgc3RkOjpzZXR3KDEwKSA8PCAiZGVxdWVcbiI7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzdHJpbmcoMzAsJy0nKSA8PCBzdGQ6OmVuZGw7CiAKICAgIGZvciggc3RkOjpzaXplX3Qgc2l6ZSA9IDE7IHNpemUgPCAxMDAwMDAwMTsgc2l6ZSAqPSAxMCApCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0dygxMCkgPDwgc2l6ZSA8PCAKICAgICAgICBzdGQ6OnNldHcoMTApIDw8IEVyYXNlTWlkZGxlPHN0ZDo6bGlzdDxUPj4oc2l6ZSkgPDwgCiAgICAgICAgc3RkOjpzZXR3KDEwKSA8PCBFcmFzZU1pZGRsZTxzdGQ6OmRlcXVlPFQ+PihzaXplKSA8PCBzdGQ6OmVuZGw7CiAgICB9ICAgIAp9CiAKY2xhc3MgQwp7CnB1YmxpYzoKICAgIEMmIG9wZXJhdG9yPSggY29uc3QgQyYgYyApCiAgICB7CiAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKDEpKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICAKICAgIEMmIG9wZXJhdG9yPSAoQyYmIGMpCiAgICB7CiAgICAgICAgcHRyID0gYy5wdHI7IC8vINC90LUg0YHQvtCy0YHQtdC8INC80LPQvdC+0LLQtdC90L3QvgogICAgICAgIGMucHRyID0gbnVsbHB0cjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CnByaXZhdGU6CiAgICB2b2lkKiBwdHI7Cn07CiAKaW50IG1haW4oKSB7CiAgICAKLy8gICAgTWVhc3VyZUZvclR5cGU8Y2hhcj4oKTsKIAogICAgTWVhc3VyZUZvclR5cGU8Qz4oKTsKICAgICAgICAKICAgICAgICByZXR1cm4gMDsKfQ==