#include <algorithm>
#include <iostream>
#include <iterator>
#include <memory>
#include <numeric>
#include <vector>
using namespace std;
int main( ) {
const auto n = 2 ;
{
cout << "vector:\n " ;
vector< vector< int >> v_mod( 3 , vector< int > ( n) ) ;
for_each( begin( v_mod) , end( v_mod) , [ ] ( auto & i) { static typename remove_reference_t< decltype( i) > :: value_type gen = 0 ; iota( i.begin ( ) , i.end ( ) , gen) ; gen + = i.size ( ) ; } ) ;
for_each( cbegin( v_mod) , cend( v_mod) , [ ] ( const auto & i) { copy( i.cbegin ( ) , i.cend ( ) , ostream_iterator< typename remove_const_t< remove_reference_t< decltype( i) >> :: value_type > ( cout , " " ) ) ; cout << endl; } ) ;
}
{
cout << "\n unique_ptr:\n " ;
unique_ptr< int [ ] > v_mod[ 3 ] ;
for ( auto & i : v_mod) {
i = make_unique< int [ ] > ( n) ;
}
for_each( begin( v_mod) , end( v_mod) , [ & ] ( auto & i) { static remove_extent_t< typename remove_reference_t< decltype( i) > :: element_type > gen = 0 ; iota( i.get ( ) , i.get ( ) + n, gen) ; gen + = n; } ) ;
for_each( cbegin( v_mod) , cend( v_mod) , [ & ] ( const auto & i) { copy( i.get ( ) , i.get ( ) + n, ostream_iterator< typename remove_const_t< remove_reference_t< decltype( i) >> :: element_type > ( cout , " " ) ) ; cout << endl; } ) ;
}
{
cout << "\n new:\n " ;
int * v_mod[ 3 ] ;
for ( auto & i : v_mod) {
i = new int [ n] ;
}
for_each( begin( v_mod) , end( v_mod) , [ & ] ( auto & i) { static remove_pointer_t< remove_reference_t< decltype( i) >> gen = 0 ; iota( i, i + n, gen) ; gen + = n; } ) ;
for_each( cbegin( v_mod) , cend( v_mod) , [ & ] ( const auto & i) { copy( i, i + n, ostream_iterator< remove_pointer_t< remove_const_t< remove_reference_t< decltype( i) >>>> ( cout , " " ) ) ; cout << endl; } ) ;
for ( auto & i : v_mod) {
delete [ ] i;
}
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgewoJY29uc3QgYXV0byBuID0gMjsKCgl7CgkJY291dCA8PCAidmVjdG9yOlxuIjsKCgkJdmVjdG9yPHZlY3RvcjxpbnQ+PiB2X21vZCgzLCB2ZWN0b3I8aW50PihuKSk7CgoJCWZvcl9lYWNoKGJlZ2luKHZfbW9kKSwgZW5kKHZfbW9kKSwgW10oYXV0byYgaSkge3N0YXRpYyB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlX3Q8ZGVjbHR5cGUoaSk+Ojp2YWx1ZV90eXBlIGdlbiA9IDA7IGlvdGEoaS5iZWdpbigpLCBpLmVuZCgpLCBnZW4pOyBnZW4gKz0gaS5zaXplKCk7IH0pOwoJCWZvcl9lYWNoKGNiZWdpbih2X21vZCksIGNlbmQodl9tb2QpLCBbXShjb25zdCBhdXRvJiBpKSB7Y29weShpLmNiZWdpbigpLCBpLmNlbmQoKSwgb3N0cmVhbV9pdGVyYXRvcjx0eXBlbmFtZSByZW1vdmVfY29uc3RfdDxyZW1vdmVfcmVmZXJlbmNlX3Q8ZGVjbHR5cGUoaSk+Pjo6dmFsdWVfdHlwZT4oY291dCwgIiAiKSk7IGNvdXQgPDwgZW5kbDt9KTsKCX0KCgl7CgkJY291dCA8PCAiXG51bmlxdWVfcHRyOlxuIjsKCgkJdW5pcXVlX3B0cjxpbnRbXT4gdl9tb2RbM107CgoJCWZvciAoYXV0byYgaSA6IHZfbW9kKSB7CgkJCWkgPSBtYWtlX3VuaXF1ZTxpbnRbXT4obik7CgkJfQoJCWZvcl9lYWNoKGJlZ2luKHZfbW9kKSwgZW5kKHZfbW9kKSwgWyZdKGF1dG8mIGkpIHtzdGF0aWMgcmVtb3ZlX2V4dGVudF90PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2VfdDxkZWNsdHlwZShpKT46OmVsZW1lbnRfdHlwZT4gZ2VuID0gMDsgaW90YShpLmdldCgpLCBpLmdldCgpICsgbiwgZ2VuKTsgZ2VuICs9IG47IH0pOwoJCWZvcl9lYWNoKGNiZWdpbih2X21vZCksIGNlbmQodl9tb2QpLCBbJl0oY29uc3QgYXV0byYgaSkge2NvcHkoaS5nZXQoKSwgaS5nZXQoKSArIG4sIG9zdHJlYW1faXRlcmF0b3I8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0X3Q8cmVtb3ZlX3JlZmVyZW5jZV90PGRlY2x0eXBlKGkpPj46OmVsZW1lbnRfdHlwZT4oY291dCwgIiAiKSk7IGNvdXQgPDwgZW5kbDt9KTsKCX0KCgl7CgkJY291dCA8PCAiXG5uZXc6XG4iOwoKCQlpbnQqIHZfbW9kWzNdOwoKCQlmb3IgKGF1dG8mIGkgOiB2X21vZCkgewoJCQlpID0gbmV3IGludFtuXTsKCQl9CgoJCWZvcl9lYWNoKGJlZ2luKHZfbW9kKSwgZW5kKHZfbW9kKSwgWyZdKGF1dG8mIGkpIHtzdGF0aWMgcmVtb3ZlX3BvaW50ZXJfdDxyZW1vdmVfcmVmZXJlbmNlX3Q8ZGVjbHR5cGUoaSk+PiBnZW4gPSAwOyBpb3RhKGksIGkgKyBuLCBnZW4pOyBnZW4gKz0gbjsgfSk7CgkJZm9yX2VhY2goY2JlZ2luKHZfbW9kKSwgY2VuZCh2X21vZCksIFsmXShjb25zdCBhdXRvJiBpKSB7Y29weShpLCBpICsgbiwgb3N0cmVhbV9pdGVyYXRvcjxyZW1vdmVfcG9pbnRlcl90PHJlbW92ZV9jb25zdF90PHJlbW92ZV9yZWZlcmVuY2VfdDxkZWNsdHlwZShpKT4+Pj4oY291dCwgIiAiKSk7IGNvdXQgPDwgZW5kbDt9KTsKCgkJZm9yIChhdXRvJiBpIDogdl9tb2QpIHsKCQkJZGVsZXRlW10gaTsKCQl9Cgl9Cn0=