gpt4 book ai didi

c++ - 如何从 C++ vector 中删除 NAN?

转载 作者:太空狗 更新时间:2023-10-29 19:56:03 32 4
gpt4 key购买 nike

我有

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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com