如何将 auto(对于 vector<string>)从 c++11 转换为 c++98?

How to convert auto (for vector<string>) from c++11 to c++98?

我在 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 match for 'operator==' in 'q==x'

拜托,帮忙。

像这样if (q == *x)

使用*获取迭代器指向的元素。

现在你有一个迭代器,而不是值,所以你必须取消引用它。并且请使用前缀++,而不是后缀++。 postfix++需要创建一个临时的,prefix++不需要,比较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;
}

在你的情况下更好:不要自己编写循环,使用标准算法(比较 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-lib)。您的功能可以通过使用 std::find.

来实现
return std::find(stariFinale.begin(), stariFinale.end(), q) != stariFinale.end();

此代码适用于 C++98 和 C++11 或更高版本:

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