#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
typedef std:: vector < std:: vector < int >> Type ;
struct Chrom // to demonstrate
{
Type bit;
} ;
std:: tuple < int , int , int > findPosition( const std:: vector < Chrom> & vec3D, const int & val)
{
int First = 0 , Second = 0 , Third = - 1 ; // initilize the positions
for ( const Chrom& each_chrom: vec3D)
{
for ( const std:: vector < int > & innerVec: each_chrom.bit )
{
std:: vector < int > :: const_iterator get_pos;
get_pos = std:: find ( innerVec.cbegin ( ) , innerVec.cend ( ) , val) ;
Third = ( * get_pos == val) ? get_pos - innerVec.cbegin ( ) : - 1 ; // check val found otherwise -1
if ( Third ! = - 1 ) return std:: make_tuple ( First, Second, Third) ; // if found return them
++ Second;
}
Second = 0 ;
Third = - 1 ;
++ First;
}
return std:: make_tuple ( First, Second, Third) ;
}
int main( )
{
// this is a 3 dimensional vector
std:: vector < Chrom> popcurrent( 2 ) ; // position inside the popcurrent
popcurrent[ 0 ] .bit = { { 3 ,2 ,1 } , // (0,0,0) (0,0,1) (0,0,2)
{ 3 ,10 ,1 } } ; // (0,1,0) (0,1,1) (0,1,2)
popcurrent[ 1 ] .bit = { { 5 ,8 ,11 } , // (1,0,0) (1,0,1) (1,0,2)
{ 4 ,7 ,1 } } ; // (1,1,0) (1,1,1) (1,1,2)
int pos_popcurrent, pos_bit, pos_inner_vec;
for ( int val = 1 ; val <= 12 ; ++ val)
{
std:: cout << "\n Currently looking for: " << val ;
std:: tie ( pos_popcurrent, pos_bit, pos_inner_vec) = findPosition( popcurrent, val) ;
( pos_inner_vec ! = - 1 ) ?
std:: cout << " found @ popcurrent[ " << pos_popcurrent << " ].bit[ " << pos_bit << " ][ " << pos_inner_vec << " ]" :
std:: cout << " Not found" ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dHVwbGU+Cgp0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yIDwgaW50Pj4gVHlwZSA7CnN0cnVjdCBDaHJvbSAgICAgICAgIC8vIHRvIGRlbW9uc3RyYXRlCnsKICBUeXBlIGJpdDsKfTsKCnN0ZDo6dHVwbGU8aW50LCBpbnQsIGludD4gZmluZFBvc2l0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPENocm9tPiYgdmVjM0QsIGNvbnN0IGludCYgdmFsKQp7CiAgIGludCBGaXJzdCA9IDAsIFNlY29uZCA9IDAsIFRoaXJkID0gLTE7ICAgLy8gaW5pdGlsaXplIHRoZSBwb3NpdGlvbnMKICAgZm9yKGNvbnN0IENocm9tJiBlYWNoX2Nocm9tOiB2ZWMzRCkKICAgewogICAgICBmb3IoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5uZXJWZWM6IGVhY2hfY2hyb20uYml0KQogICAgICB7CiAgICAgICAgIHN0ZDo6dmVjdG9yIDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBnZXRfcG9zOwogICAgICAgICBnZXRfcG9zID0gc3RkOjpmaW5kKGlubmVyVmVjLmNiZWdpbigpLCBpbm5lclZlYy5jZW5kKCksIHZhbCk7CiAgICAgICAgIFRoaXJkID0gKCpnZXRfcG9zID09IHZhbCkgPyBnZXRfcG9zIC0gaW5uZXJWZWMuY2JlZ2luKCk6IC0xOyAgIC8vIGNoZWNrIHZhbCBmb3VuZCBvdGhlcndpc2UgLTEKICAgICAgICAgaWYoVGhpcmQgIT0gLTEpIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoRmlyc3QsIFNlY29uZCwgVGhpcmQpOyAgLy8gaWYgZm91bmQgcmV0dXJuIHRoZW0KICAgICAgICAgKytTZWNvbmQ7CiAgICAgIH0KICAgICAgU2Vjb25kID0gMDsKICAgICAgVGhpcmQgPSAtMTsKICAgICAgKytGaXJzdDsKICAgfQogICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKEZpcnN0LCBTZWNvbmQsIFRoaXJkKTsKfQoKaW50IG1haW4oKQp7CiAgIC8vIHRoaXMgaXMgYSAzIGRpbWVuc2lvbmFsIHZlY3RvcgogICBzdGQ6OnZlY3RvcjxDaHJvbT4gcG9wY3VycmVudCgyKTsgICAgICAgICAgLy8gIHBvc2l0aW9uIGluc2lkZSB0aGUgcG9wY3VycmVudAogICBwb3BjdXJyZW50WzBdLmJpdCA9ICB7ICB7MywyLDF9LCAgICAgICAgICAgLy8gKDAsMCwwKSAoMCwwLDEpICgwLDAsMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMTAsMX0gIH07ICAgICAgIC8vICgwLDEsMCkgKDAsMSwxKSAoMCwxLDIpCiAgIHBvcGN1cnJlbnRbMV0uYml0ID0gIHsgIHs1LDgsMTF9LCAgICAgICAgICAvLyAoMSwwLDApICgxLDAsMSkgKDEsMCwyKQogICAgICAgICAgICAgICAgICAgICAgICAgICB7NCw3LDF9ICB9OyAgICAgICAgLy8gKDEsMSwwKSAoMSwxLDEpICgxLDEsMikKCiAgIGludCBwb3NfcG9wY3VycmVudCwgcG9zX2JpdCwgcG9zX2lubmVyX3ZlYzsKICAgZm9yKGludCB2YWwgPSAxOyB2YWwgPD0gMTI7ICsrdmFsKQogICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiXG5DdXJyZW50bHkgbG9va2luZyBmb3I6ICIgPDwgdmFsIDsKICAgICAgc3RkOjp0aWUocG9zX3BvcGN1cnJlbnQsIHBvc19iaXQsIHBvc19pbm5lcl92ZWMpID0gZmluZFBvc2l0aW9uKHBvcGN1cnJlbnQsIHZhbCk7CiAgICAgIChwb3NfaW5uZXJfdmVjICE9IC0xKSA/CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBmb3VuZCBAIHBvcGN1cnJlbnRbICIgPDwgcG9zX3BvcGN1cnJlbnQgPDwgIiBdLmJpdFsgIiA8PCBwb3NfYml0IDw8ICIgXVsgIiA8PCBwb3NfaW5uZXJfdmVjIDw8IiBdIjoKICAgICAgICAgc3RkOjpjb3V0IDw8ICIgIE5vdCBmb3VuZCI7CiAgIH0KICAgcmV0dXJuIDA7Cn0K