Ошибка поиска вектора: нет типа с именем 'iterator_category' в 'struct std :: iterator_traits - PullRequest
0 голосов
/ 30 ноября 2018

myVector - это векторные узлы.Каждый узел имеет значение типа int и имя, которое является строковым указателем.Я пытаюсь создать простую функцию, которая будет определять, имеет ли какое-либо из узлов в этом векторе это имя.

vector<Node*>::iterator it; 
it = std::find(*(*myVector.begin())->name, *(*myVector.end())->name, found);
if (it != myvector.end()) {
    return true;
}
return false;

Когда я запускаю это, я получаю сообщение об ошибке "нет типа с именем" iterator_category "вstruct std :: iterator_traits ".Я предполагаю, что это как-то связано с настройкой указателей, но я не уверен, что это будет или что означает эта ошибка.Может ли кто-нибудь объяснить мне это?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы используете алгоритм и функции-члены 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с тем же предикатом.Это ближе к вашим намерениям, так как отбрасывает позицию матча.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...