Multimap и эквивалентные ключи: как нарушить порядок вставки, когда реализация *кажется* хорошей?

Надеюсь, не обычный вопрос.

Таким образом, до C++ 11 нет никаких гарантий, что порядок вставки соблюдается. Это я понимаю (например, http://www.cplusplus.com/reference/map/multimap/insert/ и как учитывает ли порядок вставки мультикарты stl?).

Предупреждение о негарантийности относится только к переносимости между версиями и платформами?

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

Спасибо.


person hythlodayr    schedule 08.04.2014    source источник


Ответы (1)


По крайней мере, в некоторых реализациях — это подтверждено на GNU C++, по крайней мере — это может произойти при использовании подсказок.

Используя модифицированную версию кода примера в http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1780.html

typedef std::multimap<int, std::string> Map;
typedef std::pair<int, std::string> value_type;
Map m;
m.insert(value_type(0, "zero"));
m.insert(value_type(1, "one"));
m.insert(value_type(2, "two"));
display(m); // Iterates from m.begin to m.end in order and shows key/value pair.
m.insert(m.find(1), value_type(1, "ONE"));

std::pair<Map::iterator, Map::iterator> range;
range = m.equal_range(1);
Map::iterator it;

it = range.first; 
it++;

m.insert(it, value_type(1, "ONE_MID")); // Try inserting between "one" and "ONE"
display(m);

В GCC 4.6.3 это отображает:

(0, zero) (1, one) (2, two)
(0, zero) (1, ONE) (1, ONE_MID) (1, ONE) (2, two)

Что, очевидно, не является порядком вставки!

person hythlodayr    schedule 09.04.2014