#include <iostream>
#include <vector>
#include <string>
#include <utility>
class Matrix {
std:: string ** m;
int m_x, m_y;
public :
Matrix( int x = 0 , int y = 0 ) : m_x( x) , m_y( y) {
m = new std:: string * [ x] ;
for ( int i = 0 ; i < x; ++ i)
m[ i] = new std:: string [ y] ;
}
Matrix( const Matrix & src) : m_x( src.m_x ) , m_y( src.m_y ) {
m = new std:: string * [ m_x] ;
for ( int i = 0 ; i < m_x; ++ i) {
m[ i] = new std:: string [ m_y] ;
for ( int j = 0 ; j < m_y; ++ j) {
m[ i] [ j] = src.m [ i] [ j] ;
}
}
}
~Matrix( ) {
for ( int i = 0 ; i < m_x; ++ i)
delete [ ] m[ i] ;
delete [ ] m;
}
Matrix& operator= ( const Matrix & rhs) {
if ( & rhs ! = this ) {
Matrix temp( rhs) ;
std:: swap ( m, temp.m ) ;
std:: swap ( m_x, temp.m_x ) ;
std:: swap ( m_y, temp.m_y ) ;
}
return * this ;
}
void print( ) const {
for ( int i = 0 ; i < m_x; ++ i) {
for ( int j = 0 ; j < m_y; ++ j) {
std:: cout << '[' << m[ i] [ j] << ']' ;
}
std:: cout << std:: endl ;
}
}
class Proxy {
std:: string * mm;
public :
Proxy( std:: string * s) : mm( s) { }
std:: string & operator[ ] ( int index) {
return mm[ index] ;
}
} ;
Proxy operator[ ] ( int index) {
return Proxy( m[ index] ) ;
}
} ;
int main( )
{
Matrix m( 5 , 5 ) ;
m.print ( ) ;
std:: cout << std:: endl ;
m[ 2 ] [ 2 ] = "It Works" ;
std:: cout << m[ 2 ] [ 2 ] << std:: endl ;
m.print ( ) ;
std:: cout << std:: endl ;
Matrix m2( m) ;
std:: cout << m2[ 2 ] [ 2 ] << std:: endl ;
m2.print ( ) ;
std:: cout << std:: endl ;
Matrix m3;
m3 = m2;
std:: cout << m3[ 2 ] [ 2 ] << std:: endl ;
m3.print ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPiAKI2luY2x1ZGUgPHV0aWxpdHk+CgpjbGFzcyBNYXRyaXggewoJc3RkOjpzdHJpbmcgKiptOwoJaW50IG1feCwgbV95OwpwdWJsaWM6CglNYXRyaXgoaW50IHggPSAwLCBpbnQgeSA9IDApIDogbV94KHgpLCBtX3koeSkgewoJCW0gPSBuZXcgc3RkOjpzdHJpbmcqW3hdOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgeDsgKytpKQoJCQltW2ldID0gbmV3IHN0ZDo6c3RyaW5nW3ldOwoJfQoKCU1hdHJpeChjb25zdCBNYXRyaXggJnNyYykgOiBtX3goc3JjLm1feCksIG1feShzcmMubV95KSB7CgkJbSA9IG5ldyBzdGQ6OnN0cmluZypbbV94XTsKCQlmb3IgKGludCBpID0gMDsgaSA8IG1feDsgKytpKSB7CgkJCW1baV0gPSBuZXcgc3RkOjpzdHJpbmdbbV95XTsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtX3k7ICsraikgewoJCQkJbVtpXVtqXSA9IHNyYy5tW2ldW2pdOwoJCQl9CgkJfQoJfQoKCX5NYXRyaXgoKSB7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBtX3g7ICsraSkKCQkJZGVsZXRlW10gbVtpXTsKCQlkZWxldGVbXSBtOwoJfQoKCU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeCAmcmhzKSB7CgkJaWYgKCZyaHMgIT0gdGhpcykgewoJCQlNYXRyaXggdGVtcChyaHMpOwoJCQlzdGQ6OnN3YXAobSwgdGVtcC5tKTsKCQkJc3RkOjpzd2FwKG1feCwgdGVtcC5tX3gpOwoJCQlzdGQ6OnN3YXAobV95LCB0ZW1wLm1feSk7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCQoJdm9pZCBwcmludCgpIGNvbnN0IHsKCQlmb3IoaW50IGkgPSAwOyBpIDwgbV94OyArK2kpIHsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtX3k7ICsraikgewoJCQkJc3RkOjpjb3V0IDw8ICdbJyA8PCBtW2ldW2pdIDw8ICddJzsKCQkJfQoJCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJCX0KCX0KCgljbGFzcyBQcm94eSB7CgkJc3RkOjpzdHJpbmcgKm1tOwoJcHVibGljOgoJCVByb3h5KHN0ZDo6c3RyaW5nICpzKSA6IG1tKHMpIHt9CgoJCXN0ZDo6c3RyaW5nJiBvcGVyYXRvcltdKGludCBpbmRleCkgewoJCQlyZXR1cm4gbW1baW5kZXhdOwoJCX0KCX07CgoJUHJveHkgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKCQlyZXR1cm4gUHJveHkobVtpbmRleF0pOwoJfQp9OwoKaW50IG1haW4oKQp7CglNYXRyaXggbSg1LCA1KTsKCW0ucHJpbnQoKTsKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAKCW1bMl1bMl0gPSAiSXQgV29ya3MiOwoJc3RkOjpjb3V0IDw8IG1bMl1bMl0gPDwgc3RkOjplbmRsOwoJbS5wcmludCgpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKIAoJTWF0cml4IG0yKG0pOwoJc3RkOjpjb3V0IDw8IG0yWzJdWzJdIDw8IHN0ZDo6ZW5kbDsKCW0yLnByaW50KCk7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogCglNYXRyaXggbTM7CgltMyA9IG0yOwoJc3RkOjpjb3V0IDw8IG0zWzJdWzJdIDw8IHN0ZDo6ZW5kbDsKCW0zLnByaW50KCk7CgoJcmV0dXJuIDA7Cn0=