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

0

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

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

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

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

Благодарю.

Теги:
stl
multimap

1 ответ

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)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню