我的小std::独特的例子不起作用
My small std::unique example not working
我正在尝试使用cxx-11
的std::unique()
来查找array
:中的唯一元素
#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>
int main(){
const int n=11;
double x[n],a3[n],a1[n];
x[0]=-0.717778;
x[1]=-0.496843;
x[2]=-0.429063;
x[3]=-0.3596;
x[4]=-0.205607;
x[5]=0.0730536;
x[6]=0.138018;
x[7]=0.585526;
x[8]=2.40104;
x[9]=3.75268;
x[10]=4.55704;
a3[0]=0.790832;
a3[1]=0.569896;
a3[2]=0.502116;
a3[3]=0.432653;
a3[4]=0.343625;
a3[5]=0.512472;
a3[6]=0.56708;
a3[7]=1.01459;
a3[8]=2.32799;
a3[9]=3.67962;
a3[10]=4.48398;
std::cout.precision(10);
std::copy(a3,a3+n,a1);
for(int i=0;i<n;i++) a1[i]+=x[i];
std::sort(a1,a1+n);
for(int i=0;i<n;i++) std::cout << a1[i] << std::endl;
std::cout << "---" << std::endl;
int n_1=std::unique(a1,a1+n)-a1;
std::cout << "length of unique subvector " << n_1 << std::endl;
std::cout << "---" << std::endl;
for(int i=0;i<n_1;i++) std::cout << a1[i] << std::endl;
std::cout << "---" << std::endl;
}
但是当我运行这个代码时(链接到coliru)它返回:
original array
0.073053
0.073053
0.073053
0.073054
0.138018
0.5855256
0.705098
1.600116
4.72903
7.4323
9.04102
---
length of unique subarray 10
---
unique array
0.073053
0.073053
0.073054
0.138018
0.5855256
0.705098
1.600116
4.72903
7.4323
9.04102
---
唯一数组仍然包含一个重复的数组(这是错误的)!
我做错了什么?
让我们尝试更精确的std::cout.precision(20)
:
0.073052999999999979064
0.073053000000000034575
0.073053999999999952308
0.13801800000000000179
0.58552559999999997942
0.70509800000000000253
1.6001160000000000938
4.7290299999999998448
7.4322999999999996845
9.0410199999999996123
由于大多数十进制分数不能用二进制浮点格式精确表示,因此略有不同的舍入误差会导致略有不同的结果。
一般来说,你不能指望不同浮点计算的结果完全相等,即使应用于数学实数的相应计算也是如此。
相反,你可以测试"几乎相等",仔细选择一个适合你的数字域的公差。unique
允许您指定自己的谓词,而不是简单的相等测试:
std::unique(a1,a1+n,[](double x, double y){return std::abs(x-y) < tolerance;});
怎么样:
int n_1 = std::unique(a1,a1+n,
[](float a, float b)
{
return std::fabs(a-b) < 10e-9;
}
) - a1;
实时演示链接
相关文章:
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- std::rethrow(std::exception_ptr) 不起作用
- 将新放置与 std::函数一起使用不起作用
- std::string == 运算符在代码中不起作用
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- std::包含 std::函数回调的多个包装器的向量不起作用
- 初始化 std::initializer_list 通过 std:: 初始化 std::p air 在初始化 std::array 时不起作用?
- 使用 find() 通过 std::set 的迭代器将不起作用。出了什么问题?
- std::flush 不起作用,而 std::endl 可以
- 为什么 std::void_t 在这种情况下不起作用
- “std::count_if”的二进制谓词不起作用
- std::sort 在我的自定义迭代器上不起作用
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- c value_type对于std :: tr1不起作用:std :: map中的元组