c++ - list.erase 中的 Lambda 表达式

标签 c++ list lambda stdlist

我正在学习 lambda 并尝试各种示例,但我不确定我明白为什么这不起作用:

std::list<int> listIntegers;
listIntegers.push_back(40);

listIntegers.erase([listIntegers]() {
return std::find(listIntegers.begin(), listIntegers.end(), 40);
});

我也试着明确地写:

listIntegers.erase([listIntegers]()->std::list<int>::const_iterator {
    return std::find(listIntegers.begin(), listIntegers.end(), 40);
    });

但是这当然有效:

auto found40Iterator = std::find(listIntegers.begin(), listIntegers.end(), 40)

listIntegers.erase(found40Iterator);

最佳答案

考虑

listIntegers.erase([listIntegers]()->std::list<int>::const_iterator {
    return std::find(listIntegers.begin(), listIntegers.end(), 40);
});

捕获列表 [listIntegers] 按值获取 listInteger,拷贝与 lambda 一起存储。由于 std::find(listIntegers.begin(), listIntegers.end(), 40) 中使用的 listIntegers 是原件的拷贝,它将找到元素 40 在该拷贝中。因此,返回的迭代器是拷贝中元素的迭代器,而不是原始元素中的迭代器。迭代器只能与来自同一容器的其他迭代器及其原始容器一起使用。您看到的问题是您的 lambda 的返回值正在与 listIntegers 一起使用,但它实际上指的是不同范围内的元素(listIntegers 的拷贝)。

解决方案是更改您的捕获列表以通过引用获取 listIntegers,这样它将对原始 listIntegers 进行操作。还有一个问题是您没有调用 lambda,而是将其作为参数传递给 erase。通过添加一对括号,我们可以改为调用 lambda 并将其返回值传递给 erase

listIntegers.erase([&listIntegers]() {
    // Added & here ^
    return std::find(listIntegers.begin(), listIntegers.end(), 40);
}());
//^ Call the lambda

关于c++ - list.erase 中的 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52358333/

相关文章:

c# - Unity中有类似Runnable的东西吗?

c++ - OpenCV 检查机器上是否安装了视频编解码器 (C++)

python - 比较多个 Python 列表并合并 Levenshtein 相似性

python - 使用相同的 'for' 循环和 'all()' 函数会产生不同的结果

java - 如何避免向 Jsonobject 添加重复条目

C++ upper_bound 没有匹配的函数调用到 <lambda 类型的对象

java - -source 1.7 不支持 lambda 表达式

c++ - 计算范围内的数字算法 (C++)

android - Qt/C++ 的跨平台移动通知?

C++ - reference& operator= 在这里做什么