【问题标题】:Qt - Cannot get lambda to work [duplicate]Qt - 无法让lambda工作[重复]
【发布时间】:2023-03-03 16:27:01
【问题描述】:

我有以下功能,其中我想将我的 std::set<QString> words 从比 main_word 长/短的单词中修剪超过 4 个字符。

void Cluster::prune(QString main_word)
{
    words.erase(std::remove_if(words.begin(),
                               words.end(),
                               [=](QString w){return std::abs(main_word.length() - w.length()) > 4;}),
                words.end());
}

我在构建时收到以下错误:

d:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_algo.h:1176: błąd: passing 'const QString' as 'this' argument of 'QString& QString::operator=(const QString&)' discards qualifiers [-fpermissive]
             *__result = _GLIBCXX_MOVE(*__first);
                       ^

我有点困惑 - 我对这个 lambda 做错了什么?

【问题讨论】:

    标签: c++ qt c++11 lambda


    【解决方案1】:

    您不能在集合上使用 erase remove-if 习语 - 因为 set<K> 内部包含 const K 类型的元素 - 它们是不可修改的,std::remove_if 要求对象是可移动的。

    你必须使用循环:

    for (auto it = words.begin(); it != words.end(); /* nothing */)
    {
        if (std::abs(main_word.length() - it->length()) > 4) {
            it = words.erase(it);
        }
        else {
            ++it;
        }
    }
    

    【讨论】:

    • 像魅力一样工作,谢谢!所以这个 lambda 应该适用于向量,对吧?
    • @pkrysiak 对。除了这种情况,我建议对您的 lambda 进行改进:main_wordw 都应作为参考。照原样,您需要大量额外的副本。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多