Цикл, пока какой-либо из элементов std :: vector не встречается - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь сделать базовый синтаксический анализатор для кода C ++, который извлекает информацию о классах из входного кода.Для этого у меня есть метод, который ищет элементы данных, начиная с позиции итератора, пока не встретит определенные строки, такие как "public", "protected", "};".Строки передаются в векторе, потому что я должен использовать эту функцию и для других точек останова, и поэтому количество строк не может быть зафиксировано.Как я могу получить элементы вектора внутри условия цикла, когда я не знаю, на каком индексе остановиться?Это выглядит примерно так:

while(a != vect[0] && a != vect[1] .... && a != vect[END VALUE]) {
    //loop body
}

Где END VALUE может быть что угодно.

Возможно ли это?Надеюсь, я хорошо объяснил свой вопрос.Я использую итераторы в коде.Использовал подписки только для объяснения моего запроса.

Спасибо!

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

В комментариях вы беспокоитесь о том, что «мне придется перебирать вектор внутри условия цикла», однако любая реализация должна будет пройти через каждый элемент, чтобы убедиться, что он может продолжаться.

Ваше условие цикла может быть выражено как «остановка, если мы найдем a в vect», и мы можем видеть, что есть хороший std::find уже в <algorithm>. std::find возвращает итератор, указывающий, где он нашел элемент, или end, если он не нашел его.

while(std::find(vect.begin(), vect.end(), a) == vect.end()) {
    //loop body
}
0 голосов
/ 27 апреля 2019

Хотя решение было довольно простым. Мой разум просто застрял на «итерации по вектору в цикле», что было причиной.

Вот что я сделал:

bool check(const vector<string>& flags, const 
vector<string>::iterator& pos/*iterator for the vector containing code*/)

{
     for(auto it = flags.begin(); it != flags.end(); it++)
           {
               if(*pos == *it) return true;
           }
     return false;
}
0 голосов
/ 26 апреля 2019

Если он проверяет, что элемент не существует между позицией start и позицией finish, вы можете использовать:

bool not_present(size_t start, size_t finish, value_type value, const ContainerType& vect)
{
    for (size_t i = start; i <= finish; ++i)
    {
        if (value == vect[i]) return false;
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...