Пустой диапазон итераторов в векторном конструкторе - PullRequest
0 голосов
/ 06 июня 2018

Допустимо ли передавать пустой диапазон итератора в векторный конструктор?Т.е. было бы неопределенное поведение в следующем коде?

std::set<int> empty_set;
std::vector<int> target_vector(empty_set.begin(), empty_set.end());

Согласно объяснению cppreference , этот конструктор:

Создает контейнер с содержимымдиапазон [first, last).

Значит ли это first должно быть разыменовано?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Совершенно законно построить std::vector из пустого диапазона.Если first==last, новый вектор не будет иметь элементов, и first не будет разыменовываться.

Код, который у вас есть, четко определен и выполняет то, что вы ожидаете.


Поскольку указатель может использоваться в качестве итератора, это даже означает, что этот код четко определен (и возвращает ноль):

#include <vector>

int main()
{
    int const* const p = nullptr;
    std::vector<int> v(p, p);
    return v.size();
}
0 голосов
/ 06 июня 2018

Нет, такого требования нет.

Для чего он выделяет память размером std :: distance (first, last), затем копирует содержимое в цикле.

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