карт и наборов предназначены для наложения строгого слабого порядка на данные. Строгое слабое упорядочение утверждает, что ни одна запись не является эквивалентной (отличной от равной).
Вам необходимо предоставить функтор, который карта / набор может использовать для выполнения a<b
. С помощью этого функтора карта / набор сортирует свои элементы (в STL из GCC используется красно-черное дерево). Он определяет погоду, если два элемента эквивалентны, если !a<b && !b<a
- тест эквивалентности.
Функтор выглядит следующим образом:
template <class T>
struct less : binary_function<T,T,bool> {
bool operator() (const T& a, const T& b) const {
return a < b;
}
};
Если вы можете предоставить функцию, которая сообщает STL, как упорядочивать вещи, тогда карта и набор могут делать то, что вы хотите. Например
template<typename T>
struct ItemHolder
{
int insertCount;
T item;
};
Затем вы можете легко написать функтор для заказа с помощью insertCount. Если ваша реализация использует красно-черные деревья ваши базовые данные будут оставаться сбалансированными - однако вы получите большую перебалансировку, поскольку ваши данные будут генерироваться на основе инкрементного упорядочения (по сравнению со случайным) - в этом случае list
с push_back
будет лучше. Однако вы не можете получить доступ к данным по ключу так же быстро, как с картой / набором.
Если вы хотите сортировать по строке - предоставьте функтору для поиска по строке, используя insertCount, вы можете работать в обратном направлении. Если вы хотите искать по обоим, у вас может быть две карты.
map<insertcount, string> x; // auxhilary key
map<string, item> y; //primary key
Я часто использую эту стратегию - однако я никогда не помещал ее в код, который часто выполняется. Я рассматриваю boost :: bimap .