2016-06-09 22 views
5

Bir vektörüm var. Sıralanmamış. Şimdi, vektörü sıralayacak olan indekslerini almak istiyorum. Örneğin vector<int> v{1, 3, 2}, sıralanmış dizinler {0, 2, 1}, çünkü v[0] <= v[2] <= v[1]. Eğer iki eşitse, hangisinin önce gideceği önemli değil.Bir vektörün sıralanmış dizini nasıl alınır?

cevap

10

Aradığınız şey, etiket sıralama (veya dizin sıralama) olarak adlandırılır.

#include <algorithm> 
#include <numeric> 
#include <iostream> 
#include <vector> 

template<typename T> 
std::vector<std::size_t> tag_sort(const std::vector<T>& v) 
{ 
    std::vector<std::size_t> result(v.size()); 
    std::iota(std::begin(result), std::end(result), 0); 
    std::sort(std::begin(result), std::end(result), 
      [&v](const auto & lhs, const auto & rhs) 
      { 
       return v[lhs] < v[rhs]; 
      } 
    ); 
    return result; 
} 

int main() 
{ 
    std::vector<char> v{'a', 'd', 'b', 'c'}; 
    auto idxs = tag_sort(v); 
    for (auto && elem : idxs) 
     std::cout << elem << " : " << v[elem] << std::endl; 
} 

Live on Coliru

: Burada C++ 11'inde lambdas kullanarak en az bir örnektir