Как проверить, указывает ли итератор STL на что-нибудь? [дубликат]

Вероятно, хотите использовать reduce и map

let numbers = contacts.reduce((p, c, i) => {
    return p.concat(c.phoneNumbers.map(pn => pn.number));
}, []);
23
задан Community 23 May 2017 в 10:30
поделиться

4 ответа

Хотя итераторы рассматриваются как общая форма указателей, они не являются точно указателями. Стандарт определяет итератор Past-the-the-end для указания на сбой поиска в контейнерах. Следовательно, не рекомендуется проверять итераторы для значений NULL

Past-the-the-end неособыми и неотменяемыми.

if(it != aVector.end())  //past-the-end iterator
    do_something();
2
ответ дан 29 November 2019 в 01:41
поделиться

Вы не можете. Обычная идиома - использовать конечный итератор контейнера в качестве маркера «не найден». Это то, что возвращает std :: find .

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13);
if (i != v.end())
{
     // ...
}

Единственное, что вы можете сделать с неназначенным итератором, это присвоить ему значение.

48
ответ дан 29 November 2019 в 01:41
поделиться

Если вы хотите использовать итератор в цикле, самый безопасный способ использовать его в этом мода:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
 do_smth();
}
0
ответ дан 29 November 2019 в 01:41
поделиться

Я считаю, что это должно дать вам хороший тест:

if (iterator._Mycont == &MyContainer)
{
Probably a valid iterator!
}

Вы можете провести тесты, чтобы убедиться, что итератор не совпадает с концом ...

iterator != MyContainer.end()

и:

iterator >= MyContainer.begin()
-2
ответ дан 29 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: