通过 lambda 删除矢量项
Removing Vector Items via a Lambda
我只是弄乱了一些lambda表达式,我决定尝试从向量中删除重复的元素。 但是,它不起作用。 我输入了一些调试日志记录,似乎 std::count 没有返回预期的结果。 任何将不胜感激。
作为参考,我知道这不是从矢量中删除项目的最有效方法! 我只是在尝试 lambda,因为我不像我想的那样了解它们。
谢谢!
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v = { 0, 0, 1, 2, 4, 4, 4 };
std::remove_if(v.begin(), v.end(), [&v](const int &x)
{
return std::count(v.begin(), v.end(), x) > 1;
});
std::cout << "nnResult:n";
for (const auto& i : v) { std::cout << i << std::endl; }
return 0;
}
那是因为remove_if
实际上并没有删除元素:
删除是通过移动(通过移动分配)
区域中的元素来完成的,以使不删除的元素出现在范围的开头。
这就是它返回迭代器的原因,因此您可以:
对删除的调用通常后跟对容器的 erase 方法的调用,该方法将擦除未指定的值并减小容器的物理大小以匹配其新的逻辑大小。
那是:
v.erase(std::remove_if(v.begin(), v.end(), [&v](const int &x)
{
return std::count(v.begin(), v.end(), x) > 1;
}), v.end());
这被称为擦除删除习惯用语。
请注意,如果您只想删除重复项,并且您不关心保留顺序,则可以使用 std::sort
和 std::unique
(您需要sort
,因为unique
只"删除"连续的重复元素):
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 从链接列表c++中删除一个项目
- 如何使用lambda作为std::unique_ptr的删除器?
- Unique_ptr与 lambda 删除器
- 使用 lambda/std::function 删除拥有该函数的对象
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 如果我在lambda中删除容纳lambda的对象,那会发生什么
- 如何避免多个删除程序 lambda
- 如何使用lambda和函数作为unique_ptr的自定义删除程序
- 使用 lambda 函数从 std::vector 中删除特定块
- 通过 lambda 删除矢量项
- C++ lambda 常量值引用在线程中删除
- C++ lambda 删除偶数
- unique_ptr<T> 用于数组专用化的 lambda 自定义删除器
- std::唯一指针和自定义lambda删除器错误
- 了解Lambda闭包类型如何删除默认构造函数
- vc2013与2015中的Lambda删除器