Как преобразовать auto (для вектора <string>) из c ++ 11 в c ++ 98? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть этот код на C ++ 11:

vector<int> stariFinale;

bool LexAnalyzer::eStareFinala(int q)
{
    for (auto x : stariFinale)
        if (q == x)
            return true;
    return false;
}

И я попытался преобразовать его в C ++ 98, например:


bool Analizator_L::eStareFinala(int q)
{
    for (vector<int>::iterator x = stariFinale.begin(); x!= stariFinale.end(); x++)
        if (q == x)
            return true;
    return false;
}

, что дает мне ошибку no совпадение для 'operator ==' в 'q == x'

Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 04 мая 2020

Теперь у вас есть итератор, а не значение, поэтому вы должны разыменовать его. И используйте префикс ++, а не постфикс ++. Postfix ++ необходимо создать временный, а префикс ++ нет, сравните раздел принудительного применения http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rp -waste .

for (vector<int>::iterator x = stariFinale.begin(); x != stariFinale.end(); ++x)
    if (q == *x)
        return true;

Другой вариант, который требует меньших изменений кода, - это иметь итератор и старая переменная x:

for (vector<int>::iterator iter = stariFinale.begin(); iter != stariFinale.end(); ++iter) {
    int x = *iter;
    if (q == x)
        return true;
}

В вашем случае даже лучше: не пишите l oop самостоятельно, используйте стандартный алгоритм (сравните http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res -lib ). Ваша функция может быть реализована с помощью std::find.

return std::find(stariFinale.begin(), stariFinale.end(), q) != stariFinale.end();
2 голосов
/ 04 мая 2020

Вот так if (q == *x)

Используйте *, чтобы получить элемент, на который указывает итератор.

0 голосов
/ 04 мая 2020

Этот код будет работать в C ++ 98 и C ++ 11 или новее:

bool LexAnalyzer::eStareFinala(int q)
{
    return std::find( stariFinale.begin(), stariFinale.end(), q ) != stariFinale.end();
}
...