Я думаю, что вы на самом деле необходимости (но поправьте меня, если я ошибаюсь) способ доступа к элементам контейнера в определенном порядке.
Вместо того, чтобы переставлять оригинальную коллекцию, я бы взял концепцию из проекта базы данных: сохраните индекс, упорядоченный по определенному критерию. Этот индекс является дополнительным направлением, которое обеспечивает большую гибкость.
Таким образом, можно создавать несколько индексов в соответствии с различными членами класса.
using namespace std;
template< typename Iterator, typename Comparator >
struct Index {
vector<Iterator> v;
Index(Iterator from, Iterator end, Comparator& c){
v.reserve(std::distance(from,end));
for(; from != end; ++from){
v.push_back(from); // no deref!
}
sort(v.begin(), v.end(), c);
}
};
template< typename Iterator, typename Comparator >
Index<Iterator,Comparator> index (Iterator from, Iterator end, Comparator& c){
return Index<Iterator,Comparator>(from,end,c);
}
struct mytype {
string name;
double number;
};
template< typename Iter >
struct NameLess : public binary_function<Iter, Iter, bool> {
bool operator()(const Iter& t1, const Iter& t2) const { return t1->name < t2->name; }
};
template< typename Iter >
struct NumLess : public binary_function<Iter, Iter, bool> {
bool operator()(const Iter& t1, const Iter& t2) const { return t1->number < t2->number; }
};
void indices() {
mytype v[] = { { "me" , 0.0 }
, { "you" , 1.0 }
, { "them" , -1.0 }
};
mytype* vend = v + _countof(v);
Index<mytype*, NameLess<mytype*> > byname(v, vend, NameLess<mytype*>());
Index<mytype*, NumLess <mytype*> > bynum (v, vend, NumLess <mytype*>());
assert(byname.v[0] == v+0);
assert(byname.v[1] == v+2);
assert(byname.v[2] == v+1);
assert(bynum.v[0] == v+2);
assert(bynum.v[1] == v+0);
assert(bynum.v[2] == v+1);
}
Я согласен с обоими ответами, если вы собираетесь чтобы сделать это более одного раза, хотя вы можете также сделать массив, который вы сортируете, нести значения индекса с самого начала или даже создать класс, который несет все данные, которые у вас теперь есть в нескольких векторах, и сортировать все данные за один раз. – 2008-10-25 11:12:32
Я знаю, это 2015 год, но я считаю, что это супер-элегантное и простое в использовании решение: http://stackoverflow.com/q/17554242/3093378 Это на самом деле похоже на принятый ответ, но бит проще, поэтому можно реализовать `custom_sort`, который возвращает индексы` std :: vector `, аналогичные MATLAB. –
vsoftco
2015-03-28 23:24:34
См. Здесь мой ответ на дублирующий вопрос: https://stackoverflow.com/questions/838384/reorder-vector-using-a-vector-of-indices/46370247#46370247 – cDc 2017-09-22 17:38:31