c + + tipo mantendo o controle de índices

Você tem alguma rotina eficiente para retornar matriz com índices para elementos classificados em uma matriz? Eu acho que existe alguma maneira conveniente usando o vetor stl. Você já implementou um algoritmo eficiente sem stl, ou você tem um ref em pseudocódigo ou código C ++?

obrigado e cumprimentos

Usando o C ++ 11, o seguinte deve funcionar bem:

template  std::vector ordered(std::vector const& values) { std::vector indices(values.size()); std::iota(begin(indices), end(indices), static_cast(0)); std::sort( begin(indices), end(indices), [&](size_t a, size_t b) { return values[a] < values[b]; } ); return indices; } 

Você poderia tentar algo assim:

 template class index_sorter { public: compare(C const& c) : c(c) {} bool operator()(std::size_t const& lhs, std::size_t const& rhs) const { return c[lhs] < c[rhs]; } private: C const& c; }; std::sort(index_vector.begin(), index_vector.end(), index_sorter(vector)); 

Adicionando a resposta @Konrad:

Se por algum motivo você não for capaz de usar o C ++ 11, então você pode usar o boost::phoenix para simulá-lo como

  #include  #include  #include  #include  template  std::vector ordered(std::vector const& values) { using namespace boost::phoenix; using namespace boost::phoenix::arg_names; std::vector indices(values.size()); int i = 0; std::transform(values.begin(), values.end(), indices.begin(), ref(i)++); std::sort(indices.begin(), indices.end(), ref(values)[arg1] < ref(values)[arg2]); return indices; } 

Para C ++ 03, acho que esse guru da semana pode ajudá-lo:

 namespace Solution3 { template struct CompareDeref { bool operator()( const T& a, const T& b ) const { return *a < *b; } }; template struct Pair2nd { const U& operator()( const std::pair& a ) const { return a.second; } }; template void sort_idxtbl( IterIn first, IterIn last, IterOut out ) { std::multimap > v; for( int i=0; first != last; ++i, ++first ) v.insert( std::make_pair( first, i ) ); std::transform( v.begin(), v.end(), out, Pair2nd() ); } } #include  int main() { int ai[10] = { 15,12,13,14,18,11,10,17,16,19 }; std::cout << "#################" << std::endl; std::vector aidxtbl( 10 ); // use another namespace name to test a different solution Solution3::sort_idxtbl( ai, ai+10, aidxtbl.begin() ); for( int i=0; i<10; ++i ) std::cout << "i=" << i << ", aidxtbl[i]=" << aidxtbl[i] << ", ai[aidxtbl[i]]=" << ai[aidxtbl[i]] << std::endl; std::cout << "#################" << std::endl; } 

O artigo original está aqui .