Что бы я сделал, это сначала извлечь ключи (поскольку вы хотите только вернуть их) в вектор, а затем отсортировать это:
std::vector<baseObject*> out;
std::transform(myMap.begin(), myMap.end(), std::back_inserter(out), [](std::pair<Object*, baseObject*> p) { return p.first; });
std::sort(out.begin(), out.end(), [&myMap](baseObject* lhs, baseObject* rhs) { return myMap[lhs].componentID < myMap[rhs].componentID; });
Если ваш компилятор не поддерживает лямбда-выражения, просто перепишите их как свободные функции или объекты функций. Я просто использовал лямбды для краткости.
Для производительности я бы, вероятно, изначально reserve
имел достаточно места в векторе, вместо того, чтобы позволить ему постепенно расширяться.
(Также обратите внимание, что я не тестировал код, поэтому, возможно, потребуется немного повозиться)
Кроме того, я не знаю, что должна представлять эта карта, но наличие карты, где и ключ, и тип значения являются указателями, на самом деле вызывает покалывание в моем «плохом C++». Пахнет ручным управлением памятью и запутанной (или несуществующей) семантикой владения.
Вы упомянули получение вывода в list
, но vector
почти наверняка является более эффективным вариантом, поэтому я использовал его. Единственная ситуация, когда list
предпочтительнее, - это когда вы не собираетесь когда-либо перебирать его, и если вам нужна гарантия того, что указатели и итераторы останутся действительными после изменения списка.
person
jalf
schedule
24.05.2012
std::list
? Сортировкаstd::vector
может быть более эффективной, поскольку алгоритм сортировки может полагаться на итераторы произвольного доступа, недоступные в списке. - person Branko Dimitrijevic   schedule 24.05.2012Object*
сопоставляются с равными указателямиbaseObject*
или с разными указателями, реферанды которых имеют одинаковое значениеID
)? Если нет, то можно и не думать о создании карты baseObject.ID -> Object*. - person Steve Jessop   schedule 24.05.2012