#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));
}
};
int main() {
// MeasureForType<char>();
MeasureForType<C>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dGhyZWFkPgoKdGVtcGxhdGUgPGNsYXNzIEM+CmludCBFcmFzZU1pZGRsZShzdGQ6OnNpemVfdCBzaXplKQp7CiAgICBDIGNvbnRhaW5lcihzaXplKTsKICAgIAogICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoKICAgIGF1dG8gaXQgPSBzdGQ6OmJlZ2luKGNvbnRhaW5lcik7CiAgICBzdGQ6OmFkdmFuY2UoIGl0LCBzaXplLzIgKTsKICAgIGNvbnRhaW5lci5lcmFzZSggaXQgKTsKCiAgICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpIC0gc3RhcnQgKS5jb3VudCgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBNZWFzdXJlRm9yVHlwZSgpCnsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMTApIDw8ICJzaXplIiA8PCBzdGQ6OnNldHcoMTApIDw8ICJsaXN0IiA8PCBzdGQ6OnNldHcoMTApIDw8ICJkZXF1ZVxuIjsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnN0cmluZygzMCwnLScpIDw8IHN0ZDo6ZW5kbDsKCiAgICBmb3IoIHN0ZDo6c2l6ZV90IHNpemUgPSAxOyBzaXplIDwgMTAwMDAwMDE7IHNpemUgKj0gMTAgKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMTApIDw8IHNpemUgPDwgCiAgICAgICAgc3RkOjpzZXR3KDEwKSA8PCBFcmFzZU1pZGRsZTxzdGQ6Omxpc3Q8VD4+KHNpemUpIDw8IAogICAgICAgIHN0ZDo6c2V0dygxMCkgPDwgRXJhc2VNaWRkbGU8c3RkOjpkZXF1ZTxUPj4oc2l6ZSkgPDwgc3RkOjplbmRsOwogICAgfSAgICAKfQoKY2xhc3MgQwp7CnB1YmxpYzoKICAgIEMmIG9wZXJhdG9yPSggY29uc3QgQyYgYyApCiAgICB7CiAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKDEpKTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgCi8vICAgIE1lYXN1cmVGb3JUeXBlPGNoYXI+KCk7CgogICAgTWVhc3VyZUZvclR5cGU8Qz4oKTsKIAkKCXJldHVybiAwOwp9