Вы используете алгоритм и функции-члены begin()
/ end()
неправильно.Прежде всего,
*myVector.end()
- это уже неопределенное поведение, так как все контейнерные end()
функции возвращают один за другим, то есть не разыменовываемый итератор.Разыменование приводит к UB.
Во-вторых, вызов std::find
должен быть
const auto it = std::find_if(myVector.cbegin(), myVector.cend(),
[&found](const Node *n){ return n->name() == found; });
Необходимо указать пользовательский предикат - здесь, лямбда-выражение - потому что алгоритм find
можно перебирать только узлы, а не их имена, и, следовательно, вы должны указать способ определения соответствия, вызвав Node::name()
и сравнив его с found
.
Позвольте мне добавить пару дополнительных примечаний:
- Чтобы передать пользовательский предикат, вам нужен алгоритм
std::find_if
вместо std::find
. - Я использовал функции
cbegin()
и cend()
,так как контейнер не будет изменен. - Использование вывода типа (
auto
) для итераторов широко распространено и упрощает их использование. - Возможно, вы захотите улучшить свое именование.
it
может быть firstMatchingNode
и found
например lookupName
. - Если вас интересует, существует ли хотя бы одно совпадающее имя узла, рассмотрите
std::any_of
с тем же предикатом.Это ближе к вашим намерениям, так как отбрасывает позицию матча.