Вероятно, хотите использовать reduce
и map
let numbers = contacts.reduce((p, c, i) => {
return p.concat(c.phoneNumbers.map(pn => pn.number));
}, []);
Хотя итераторы рассматриваются как общая форма указателей, они не являются точно указателями. Стандарт определяет итератор Past-the-the-end
для указания на сбой поиска в контейнерах. Следовательно, не рекомендуется проверять итераторы для значений NULL
Past-the-the-end
неособыми и неотменяемыми.
if(it != aVector.end()) //past-the-end iterator
do_something();
Вы не можете. Обычная идиома - использовать конечный итератор контейнера в качестве маркера «не найден». Это то, что возвращает std :: find
.
std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13);
if (i != v.end())
{
// ...
}
Единственное, что вы можете сделать с неназначенным итератором, это присвоить ему значение.
Если вы хотите использовать итератор в цикле, самый безопасный способ использовать его в этом мода:
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
do_smth();
}
Я считаю, что это должно дать вам хороший тест:
if (iterator._Mycont == &MyContainer)
{
Probably a valid iterator!
}
Вы можете провести тесты, чтобы убедиться, что итератор не совпадает с концом ...
iterator != MyContainer.end()
и:
iterator >= MyContainer.begin()