Я вставляю элемент A в std::set S такой, что несколько элементов в S равны A: std::pair<iterator, bool> res = S.insert(A); В итоге res.second == false. Вопрос: на какой из элементов будет указывать res.first? Опыты показали, что на последний. Всегда ли будет так?
srm Implementation dependent, я думаю. Вообще, insert не для этих целей. Вместо него есть lower_bound и upper_bound.
srm Это невозможно. std::set хранит только уникальные значения. Цитата из исходников libstdc++: Из этого следует, что итератор из пары указывает на вставленный или на уже существующий элемент. А bool из пары показывает, вставлялся ли элемент реально или он там уже был.
phprus Возможно. Под равенством в данном случае понимается эквивалентность согласно терминологии стандарта. А эквивалентность не обязана быть транзитивной. Т.е. в std::set могут быть два элемента a ≠ b, каждый из которых эквивалентен вставляемому элементу c: a = с и b = c.
l_inc А как реализовать не транзитивную эквивалентность, если std::set выводит все операции сравнения из пользовательской реализации оператора "<" (меньше)? Те A == B когда (!(A < B) && !(B < A)).
l_inc Действительно возможно. Но тогда, если я правильно понимаю пункт 25.3 стандарта: использование такого оператора сравнения будет не допустимо, так как работоспособность не гарантируется. std::set требует (пункт 23.1.2): По материалам стандарта C++2003.
phprus Ну... недопустимо — это сильно сказано. Просто не поддерживается стандартом. Я ведь упомянул в указанной теме, что транзитивность нарушена, но это нестрашно.