【问题标题】:How to convert auto (for vector<string>) from c++11 to c++98?如何将 auto (for vector<string>) 从 c++11 转换为 c++98?
【发布时间】:2020-05-04 20:17:18
【问题描述】:

我在 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'

请帮忙。

【问题讨论】:

  • 逐字包含编译器错误消息,而不是转述,会使问题对未来的读者更有帮助。

标签: c++ c++98


【解决方案1】:

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

【讨论】:

  • 尽管关于前缀优于后缀的 cmets 是好的,但必须注意大多数编译器会选择这个未使用的值并将其分解。然而,这可能取决于您的优化标志。
  • @TarickWelling 如果谈论像int 这样的内置类型,我同意,但是对于迭代器对象,优化器很难看到这一点,因为它需要内联等等。编译器可能会在迭代器的情况下进行优化,但他也可能不会优化。
【解决方案2】:

点赞if (q == *x)

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2014-11-19
      • 2021-08-20
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多