Используйте multimap
для vector
(значение, индекс), чтобы обрабатывать дубли. Используйте обратные итераторы, чтобы просмотреть результаты в порядке убывания.
#include <multimap>
#include <vector>
using namespace std;
multimap<double, size_t> indices;
vector<double> values;
values.push_back(1.0);
values.push_back(2.0);
values.push_back(3.0);
values.push_back(4.0);
size_t i = 0;
for(vector<double>::const_iterator iter = values.begin();
iter != values.end(); ++iter, ++i)
{
indices.insert(make_pair<double,int>(*iter, i));
}
i = 0;
size_t limit = 2;
for (multimap<double, size_t>::const_reverse_iterator iter = indices.rbegin();
iter != indices.rend() && i < limit; ++iter, ++i)
{
cout << "Value " << iter->first << " index " << iter->second << endl;
}
Выход
Значение 4, индекс 3
Значение 3, индекс 2
Если вы хотите получить индексы vector
после сортировки, используйте это:
#include <algorithm>
#include <vector>
using namespace std;
vector<double> values;
values.push_back(1.0);
values.push_back(2.0);
values.push_back(3.0);
values.push_back(4.0);
sort(values.rbegin(), values.rend());
Верхние записи K индексируются от 0 до K-1 и отображаются в порядке убывания. При этом используются обратные итераторы в сочетании со стандартным sort
(с использованием less<double>
для достижения нисходящего порядка при повторной итерации вперед. Эквивалентно:
sort(values.rbegin(), values.rend(), less<double>());
Пример кода для превосходного nth_element
решения, предложенного здесь @Kiril (K = 125000, N = 500000). Я хотел попробовать это, так что вот оно.
vector<double> values;
for (size_t i = 0; i < 500000; ++i)
{
values.push_back(rand());
}
nth_element(values.begin(), values.begin()+375000, values.end());
sort(values.begin()+375000, values.end());
vector<double> results(values.rbegin(), values.rbegin() + values.size() - 375000);