#include <iostream>
#include <vector>
struct Element
{
Element( int number) :
number_ID( number)
{
std:: cout << "Element number " << number_ID
<< " is being constructed\n " ;
}
Element( const Element & src) :
number_ID( src.number_ID )
{
std:: cout << "Element number " << number_ID << " is being copied\n " ;
}
Element( const Element && src) :
number_ID( src.number_ID )
{
std:: cout << "Element number " << number_ID << " is being moved\n " ;
}
~Element( )
{
std:: cout << "Element number " << number_ID << " is being destroyed\n " ;
}
Element& operator= ( const Element & src)
{
number_ID = src.number_ID ;
std:: cout << "Element number " << number_ID << " is being assigned\n " ;
return * this ;
}
Element& operator= ( Element && src)
{
number_ID = src.number_ID ;
std:: cout << "Element number " << number_ID << " is being move assigned\n " ;
return * this ;
}
int number_ID;
} ;
void createVector( )
{
std:: vector < Element> objArr;
objArr.reserve ( 10 ) ; // So it doesn't have to reallocate
objArr.emplace_back ( 1 ) ;
objArr.emplace_back ( 2 ) ;
objArr.emplace_back ( 3 ) ;
objArr.emplace_back ( 4 ) ;
objArr.erase ( objArr.begin ( ) ) ; // When I erase the first element only element 4 has destructor called
}
int main( )
{
createVector( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKCnN0cnVjdCBFbGVtZW50CnsKICAgIEVsZW1lbnQoaW50IG51bWJlcikgOgogICAgICAgICAgICBudW1iZXJfSUQobnVtYmVyKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbWVudCBudW1iZXIgIiA8PCBudW1iZXJfSUQKICAgICAgICAgICAgICAgICAgPDwgIiBpcyBiZWluZyBjb25zdHJ1Y3RlZFxuIjsKICAgIH0KICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmc3JjKSA6CiAgICAgICAgICAgIG51bWJlcl9JRChzcmMubnVtYmVyX0lEKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbWVudCBudW1iZXIgIiA8PCBudW1iZXJfSUQgPDwgIiBpcyBiZWluZyBjb3BpZWRcbiI7CiAgICB9CiAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJiZzcmMpIDoKICAgICAgICAgICAgbnVtYmVyX0lEKHNyYy5udW1iZXJfSUQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJFbGVtZW50IG51bWJlciAiIDw8IG51bWJlcl9JRCA8PCAiIGlzIGJlaW5nIG1vdmVkXG4iOwogICAgfQogICAgfkVsZW1lbnQoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbWVudCBudW1iZXIgIiA8PCBudW1iZXJfSUQgPDwgIiBpcyBiZWluZyBkZXN0cm95ZWRcbiI7CiAgICB9CgogICAgRWxlbWVudCYgb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJnNyYykKICAgIHsKICAgICAgICBudW1iZXJfSUQgPSBzcmMubnVtYmVyX0lEOwogICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbWVudCBudW1iZXIgIiA8PCBudW1iZXJfSUQgPDwgIiBpcyBiZWluZyBhc3NpZ25lZFxuIjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBFbGVtZW50JiBvcGVyYXRvcj0oRWxlbWVudCAmJnNyYykKICAgIHsKICAgICAgICBudW1iZXJfSUQgPSBzcmMubnVtYmVyX0lEOwogICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbWVudCBudW1iZXIgIiA8PCBudW1iZXJfSUQgPDwgIiBpcyBiZWluZyBtb3ZlIGFzc2lnbmVkXG4iOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBpbnQgbnVtYmVyX0lEOwp9OwoKdm9pZCBjcmVhdGVWZWN0b3IoKQp7CiAgICBzdGQ6OnZlY3RvcjxFbGVtZW50PiBvYmpBcnI7CiAgICBvYmpBcnIucmVzZXJ2ZSgxMCk7ICAgICAgICAvLyBTbyBpdCBkb2Vzbid0IGhhdmUgdG8gcmVhbGxvY2F0ZQoKICAgIG9iakFyci5lbXBsYWNlX2JhY2soMSk7CiAgICBvYmpBcnIuZW1wbGFjZV9iYWNrKDIpOwogICAgb2JqQXJyLmVtcGxhY2VfYmFjaygzKTsKICAgIG9iakFyci5lbXBsYWNlX2JhY2soNCk7CgogICAgb2JqQXJyLmVyYXNlKG9iakFyci5iZWdpbigpKTsgLy8gV2hlbiBJIGVyYXNlIHRoZSBmaXJzdCBlbGVtZW50IG9ubHkgZWxlbWVudCA0IGhhcyBkZXN0cnVjdG9yIGNhbGxlZAp9CgppbnQgbWFpbigpCnsKICAgIGNyZWF0ZVZlY3RvcigpOwp9Cg==