Приводит ли передача пустого диапазона (идентичных итераторов) к алгоритму STL к определенному поведению? - PullRequest
4 голосов
/ 16 февраля 2010

Рассмотрим следующее:

std::vector<int> vec(1); // vector has one element
std::fill(vec.begin(), vec.begin(), 42);
std::fill(vec.begin()+1, vec.end(), 43);
std::fill(vec.end(), vec.end(), 44);

Приведет ли все приведенное выше использование std::fill к определенному поведению? Я гарантированно, что VEC останется неизменным? Я склонен думать «да», но я хочу убедиться, что стандарт допускает такое использование.

Ответы [ 2 ]

9 голосов
/ 16 февраля 2010

Нет, если не вызывает неопределенного поведения.

Стандарт определяет пустой диапазон итератора в 24.1 / 7, и нигде не говорится, что предоставление пустого диапазона алгоритму std::fill вызывает неопределенное поведение.

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

1 голос
/ 16 февраля 2010

Хотя я не верю, что в стандарте это специально запрещено, я бы сказал, нет. Стандарт требует, чтобы диапазоны итераторов были типа [first, last), который включает в себя first и все до, но не включая last. Передача одного и того же значения для first и last не имеет логического смысла с этим определением, так как оно будет и включено, и не включено, поэтому я ожидаю получить неопределенное поведение обратно.

EDIT: Вычистил мой первоначальный ответ и добавил следующее: после чистки моих математических обозначений интервалов я обнаружил, что интервал вида [x,x) определяется как пустой набор. Поэтому мой приведенный выше ответ неверен - я НЕ ожидаю получить неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...