Подтвердить что ты не робот

С++ 98 v. С++ 11 std:: set:: insert Спецификации

Значение итератора передается как подсказка позиции к std::set::insert(iterator position, const value_type& val) и std::multiset::insert(iterator position, const value_type& val) изменениям между С++ 98 и С++ 11. Есть ли простой способ во время компиляции обнаружить, что используется и использовать другой код

Общая проверка на С++ 11 не кажется хорошей идеей (1, 2), и я не видел подходящего макроса Boost.Config.

В частности, документация для С++ 98 говорит:

Функция оптимизирует время вставки, если позиция указывает на элемент, который будет предшествовать вставленному элементу.

а для С++ 11 он говорит:

Функция оптимизирует время вставки, если позиция указывает на элемент, который будет следовать вставленному элементу (или до конца, если он будет последним).

Это важно, потому что подсказка влияет на сложность вызова вставки. Если подсказка верна, сложность - это только амортизированная константа. Но если это не так, оно логарифмическое по размеру.

Update

Как хорошо описано ниже JerryCoffin, спецификация С++ 98, по сути, является опечаткой.

4b9b3361

Ответ 1

Это было предметом отчета о дефекте , LWG issue # 233 и n1780.

Как отмечено там, это была, по-видимому, простая ошибка при редактировании стандарта С++ 98.

Оригинальная реализация Stepanov работала в соответствии с текущей спецификацией, и насколько я знаю, большинство (всех?) реализаций, так как сделали то же самое (хотя есть один, который выглядит как до и после намеченного местоположения, так что вы получите оптимальное поведение, если вы укажете один из них).

Это также позволяет намекнуть, что вставка будет в начале набора, что невозможно в соответствии с предыдущей спецификацией.