#include <vector>
#include <iostream>
#include <iterator>


using std::cout;    using std::endl;
using std::ostream; using std::vector;


class Integer {

public:
    Integer() {
    	cout << "C " << this << " default" << endl;
        x = -1;     // default value
    }

    ~Integer() {
    	cout << "D " << this << endl;
        x = -5;     // destructed value. Not 0 so we can clearly see it
    }

    Integer(int r) {
    	cout << "C " << this << " value " << r << endl;
        x = r;
    }

    Integer(const Integer& other) {
    	cout << "C " << this << " copy from " << &other << endl;
        x = other.x;
    }

    Integer operator=(const Integer& other) {
    	cout << "A " << this << " copy from " << &other << endl;
        x = other.x;
        return *this;
    }

    operator int() const{
        return x;
    }

    friend ostream& operator<<(ostream& os, const Integer& thing) {
        os << thing.x;
        return os;
    }

private:
    int x;
};


ostream& operator<<(ostream& os, const vector<Integer> &v) {
    std::copy(v.begin(), v.end(), std::ostream_iterator<Integer>(os, ", "));
    return os;
}

int main() {
    std::vector<Integer> ret {18, 7, 4, 24,11};
    cout << "Before: " << ret << endl;
    cout << "  ret[0] is at " << &ret[0] << endl;
    ret.insert(ret.begin() + 1, ret[2]);
    cout << "After: " <<  ret << endl;
    cout << "  ret[0] is at " << &ret[0] << endl;
    return 0;
}