Вызывает ли std :: find для пустого вектора неопределенное поведение? - PullRequest
0 голосов
/ 08 января 2019

пытается найти информацию о том, что происходит, если пустой вектор использовался во время std :: find, но ему не повезло найти какую-либо информацию.

Мой вопрос таков: если пустой вектор передается в std :: find, всегда ли возвращаемое значение равно nullptr или это неопределенное поведение?

  std::vector<int> someDataContainer;
  auto it = std::find(someDataContainer.begin(), someDataContainer.end(), 1);

Ответы [ 4 ]

0 голосов
/ 08 января 2019

Это задокументировано на здесь и здесь . Если элемент не может быть найден, возвращается last, т. Е. В вашем случае it будет указывать на someDataContainer.end().

0 голосов
/ 08 января 2019

Возвращаемым значением find, когда элемент отсутствует, является итератор end:

[ alg.find ] (выделено мной):

Пусть E будет:

  • *i == value для find,
  • [...]

Возвращает: Первый итератор i в диапазоне [first, last), для которого E равно true. Возвращает last, если такой итератор не найден .

Сюда входит элемент, отсутствующий, поскольку диапазон пуст.

0 голосов
/ 08 января 2019

Неважно, если контейнер пуст или нет, std::find вернет итератор end, если элемент не найден.

А в пустом контейнере элемент не будет найден.

Короче говоря: все четко и нормально.

0 голосов
/ 08 января 2019

Пустой вектор будет иметь begin() == end(), поэтому std::find просто немедленно вернется и вернет end(). Здесь нет неопределенного поведения.

...