2010-11-04 5 views
1

Мне нужна структура данных, которая может автоматически сортироваться на основе структуры.STAT datastructure с сортировкой

struct{ 
    int key; 
    int comparisonValue(size of the vector); 
} 

мне это нужно в следующем виде:

datastructure<struct, vector<int>> 

Если структура данных автоматически сортируется на основе comparisonValue и на основе минимального значения значения для сравнения, я хотел бы получить вектор и добавить к нему некоторые данные.

Какую структуру данных я мог бы использовать? Могу ли я использовать карту и есть ли собственный сортировщик для карты?

Что мне делать, если мне нужно изменить ключ, в этом случае compareValue и сохранить порядок сортировки?

Благодаря

ответ

10

std::map из STL.

По умолчанию, это сортирует значения ключей, сравнивая их с помощью std::less<Key>, который по умолчанию вызывает operator< по значениям ключа. Таким образом, вы можете определить перегрузку operator< для вашего типа STRUCT ::

bool operator<(const Key &a, const Key &b) 
{ 
    return (a.someField < b.someField); 
} 
+0

Спасибо за ответ. Я реализовал этот метод. Похоже, make_pair требует от меня перегрузки оператора ==. Почему это так? – Leslieg

+0

/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_function.h:203:23: ошибка: нет соответствия для âoperator == â в â__x == __yâ /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/ bits/random.h: 3360: 3: note: кандидат: bool std :: operator == (const std :: bernoulli_distribution &, const std :: bernoulli_distribution &) – Leslieg

+0

@Leslieg: Этого не должно быть. Можете ли вы опубликовать код, который используете, вместе с ошибкой компилятора? –

1

»... и на основе минимального значения значения для сравнения, я хотел бы получить вектор и добавить в него данные "

Если вы имеете в виду, что хотите получить наименьший элемент во всей коллекции, вам может быть лучше с std::priority_queue, предполагая, что вы только обновляете самый маленький элемент.

В противном случае std::map, вероятно, вам нужно, как предлагает Оли Чарльворт. Вероятно, вам стоит взглянуть на map's lower_bound() и upper_bound() методов.

Вы также должны знать, что контейнеры STL содержат экземпляров объектов, поэтому, если вы хотите, чтобы ваши изменения отражались в другом месте, вам нужно вместо этого сохранить указатели на объекты. Затем вы будете использовать отдельный Functor для сравнения указателей в соответствии с тем, что они указывают.

+0

Что мне делать, если мне нужно изменить ключ, в этом случае compareValue и сохранить порядок сортировки? – Leslieg

+0

@Leslieg: В случае 'std :: map', по крайней мере, вам нужно будет удалить исходный элемент и вставить новый. –

Смежные вопросы