Я не уверен, что смогу объяснить это правильно.Вот моя попытка:
(1).vector<int> indices( vecNum.size() );
Вы создаете вектор для хранения индексов для элементов в векторе vecNum
.Очевидно, что количество элементов в этом векторе равно количеству элементов в vecNum
.
(2).iota( indices.begin(), indices.end(), 0 );
Инициализация indices
значениями от 0 - vecNum.size() - 1
(3).
sort(indices.begin(), indices.end(),
IndexCompare<vector<int>::iterator>(vecNum.begin(),vecNum.end()));
Для каждого элемента в векторе indices
вызывается функтор IndexCompare
.Этот функтор в своем operator()
получает значение из вектора vecNum
, соответствующего данной позиции индекса.Таким образом, в основном вы сортируете вектор indices
(не vecNum
) на основе значений в vecNum
.Следовательно, vecNum
остается неизменным, а indices
сортируется на основе значений из vecNum
.
Чтобы сделать его более понятным (я надеюсь), начальное состояние вектора индексов будет выглядеть так: индексы= 0,1,2 и vecNum = 20,10,30
Теперь вы звоните std::sort
со своим функтором.Таким образом, чтобы определить, является ли 0 меньше 1 sort
, алгоритм будет использовать ваш функтор.Внутри функтора вы определяете, 0 <1, используя логику: vecNum [0] (то есть 20) <vecNum [1] (то есть 10).Таким образом, отсортированная позиция будет иметь индексы = 1,0,2. </p>