2010-09-20 3 views
5

У меня есть структураЭффективная структура данных для хранения переменной структуры с сортировкой возможности

struct dbdetails 
{ 
    int id; 
    string val; 
}; 

мне нужна структура данных в C++, который может содержать переменную структуру с возможностью сортировки. Является ли это возможным? Я смотрел на вектор, который может содержать структурную переменную, но я не буду сортировать ее на основе id, потому что это член структуры. Какие-либо предложения?

+6

'try' - зарезервированное ключевое слово в C++. Вы уверены, что эта 'struct' называется« try? »? –

+0

Нет, я просто пытался привести пример. Я не использую try. Он называется dbdetails в моей программе. – sethu

+0

О, ладно. Я редактировал вопрос, чтобы включить это имя, чтобы оно не вызывало ошибку компиляции. –

ответ

6

Вам нужен собственный функтор для сравнения ваших попыток. Это должно сделать трюк:

#include <algorithm> 
#include <vector> 
// try is a keyword. renamed 
struct sorthelper : public std::binary_function<try_, try_, bool> 
{ 
    inline bool operator()(const try_& left, const try_& right) 
    { return left.id < right.id; } 
}; 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end(), sorthelper()); 
... 

Пожалуйста, не стесняйтесь спросить, есть ли у вас какие-либо последующие вопросы. У вас есть книга Страуструпа?

Edit: Предложение о Маттео:

struct try_ 
{ 
    int id; 
    string val; 
    bool operator<(const try_& other) const 
     {return id < other.id;} 

}; // no s here plz. 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end()); 
... 
+2

Альтернативой может быть определение меньшего оператора как члена структуры и избежание записи пользовательских сопоставлений. –

0

Вы можете отсортировать векторный материал на основе элементов структуры. Вам просто нужен пользовательский компаратор.

1

Вы можете иметь vector из struct «S, а затем отсортировать их:

std::sort(vectStruct.begin(), vectStruct.end(), &vectStructSort); 

bool vectStructSort(Try const& lhs, Try const& rhs) { // try is keyword. 
    return lhs.id < rhs.id; 
} 
+0

Я действительно не поймал использование зарезервированной попытки. Отредактировал это в своем посте. –

1

Это зависит от того, что требования у вас на контейнере данных. Вы можете найти полезный набор (в Stl, Set является отсортированным ассоциативным контейнером для хранения объектов типа Key). Или даже набор Hash или отсортированный массив.

Если вы знаете, что вам нужны ваши элементы для сортировки, возможно, лучше использовать сортированный контейнер, а не сортировать его каждый раз, когда вам нужно.

+0

Хеш-набор/карта неупорядочены, AFAIK. Они обеспечивают быстрый поиск, но они неупорядочены и не могут быть заказаны. –

4

Вы можете использовать std::map. Они отсортированы по ключу, так что вы можете сделать:

std::map<int, std::string> myStuff; 

Это карта с int как ключ и std::string в качестве значения. Когда вы перебираете карту, вы обнаружите, что она автоматически сортируется по ключу.

Обратите внимание, что вам не понадобится struct с этим решением. Если вам абсолютно нужны данные в struct (возможно, для взаимодействия с какой-либо внешней библиотекой), вы всегда можете скопировать данные из map в struct по мере необходимости.

1

Все заказываемые контейнеры (std::set, std::map, std::multiset, std::multimap), заказываются. Неупорядоченные контейнеры (std::list, std::vector, std::deque) можно заказать, предоставив функцию сравнения a, используя std::sort (вектор, deque) или предоставив компаратору метод (список) участника.

Все это сводится к тому, что вам действительно нужно. Если вам нужно постоянно сортировать элементы, сортированный контейнер может быть более эффективным, чем изменение контейнера и прибегание. С другой стороны, если сортировка контейнера во все времена не является требованием, но, имея возможность изменять элементы, вы можете предпочесть вектор. Сортированные контейнеры поддерживают ключи как постоянные объекты, так как модификация ключей разрушает инвариант сортировки.

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

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