作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有
std::vector<double>x={1,2,NAN,3, NAN, 4}
当我尝试 x.erase(remove(x.begin(), x.end(), NAN), x.end()
时,我仍然看到 NAN
作为
for (auto i:x)
std::cout<<i<<" ";
给予
1 2 -nan(ind) 3 -nan(ind) 4
我怎样才能删除 NAN,使输出如下所示?
1 2 3 4
编辑:x
是 double vector ,而不是整数
最佳答案
在 IEEE 754 浮点的怪异、狂野的世界中,NaN != NaN。换句话说,两个非数字值不比较为彼此相等。因此,您不能简单地让 std::remove
进行相等性测试。
您需要提供自己的谓词来调用一个函数来确定浮点值是否为 NaN。如果您的目标是 C++11 或更高版本,标准库提供了这样一个函数:std::isnan
。 (如果没有,the situation is a bit more complicated。)
把它们放在一起,那么正确的代码应该是这样的:
#include <cmath>
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<double> x = {
1,
2,
std::numeric_limits<double>::quiet_NaN(),
3,
std::numeric_limits<double>::quiet_NaN(),
4
};
std::cout << "Before removing: ";
for (auto i : x)
{
std::cout << i << " ";
}
std::cout << "\n";
x.erase(std::remove_if(std::begin(x),
std::end(x),
[](const auto& value) { return std::isnan(value); }),
std::end(x));
std::cout << "After removing: ";
for (auto i : x)
{
std::cout << i << " ";
}
return 0;
}
如果它在所有演示代码中丢失,相关部分只是:
x.erase(std::remove_if(std::begin(x),
std::end(x),
[](const auto& value) { return std::isnan(value); }),
std::end(x));
我将 lambda 作为一元谓词传递给 std::remove_if
。它调用 std::isnan
,传入要检查的值,并返回结果,这是一个 bool 值,指示该值是否为非数字。如果谓词返回真,std::remove_if
执行删除;否则,它不会。
请注意,浮点世界中的逻辑通常是 NaN 值具有传染性。换句话说,任何涉及 NaN 的操作都将返回 NaN 作为结果。所以,我觉得你试图删除所有 NaN 值有点奇怪。小心不要把它们推到地毯下,就好像它们不存在一样。
关于c++ - 如何从 C++ vector 中删除 NAN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56387427/
我是一名优秀的程序员,十分优秀!