急!!!map能找到匹配的值吗?

fengfeng2003 2003-06-17 07:57:05
建立一个double到double的映射
例如:
1.23 5
3,455 7

用map的find函数能找到匹配的值吗?
是不是要自己建立比较函数,(因为double型是不能用==来判断相等的。)
我试了一下,好像可以,
到底行不行,请哪位大侠帮忙解释一下。多谢!!!
...全文
1052 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2003-06-19
  • 打赏
  • 举报
回复
template<class Key, class T, class Pred = less<Key>, class A = allocator<T> >
~~~~~~~~~~~~~~~~~~~~~~~这个不就是比较操作么,自己写一个传个map就可以了
fangrk 2003-06-19
  • 打赏
  • 举报
回复
不过我觉得double的精度很高了,小数点后10位没有问题的
fangrk 2003-06-19
  • 打赏
  • 举报
回复
在我上面的例子中,我用了3.14作为key,程序表明是可行的。你若不放心,可以把自己的需求封装起来。比如说:
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
class MyDouble
{
public:
MyDouble(double V=double()){value=V;}
double AsDouble()const{return value;}
bool operator<(const MyDouble& rhs) const
{
return static_cast<int>(value/precision)<static_cast<int>(rhs.AsDouble()/precision);
}
bool operator==(const MyDouble& rhs) const
{
return fabs(value-rhs.AsDouble())<precision;
}
private:
double value;
static double precision;
};
double MyDouble::precision=1e-8;
int main()
{
map<MyDouble,int> M;
M[MyDouble(1.2300000001)]=123;
M[MyDouble(1.2300000002)]=456;
cout<<M.size()<<endl;
}
fullsail 2003-06-18
  • 打赏
  • 举报
回复
可以。也不可以。
可以是说double类型不是没有==,而是==又有精度问题(所以不一定可以),特别是一些用整数转换的double。比如a=0,
if(a==0)这个条件就不一定成立了,所以你要保证你的精度范围,严格控制转换。
林锐在他的书里推荐的写法是
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)

我觉得还是最好不要写出double a =0的代码,这样对谁都好。


Toslavik(Norns) :
而且更可怕的是用[]查找时如果不存在会自动加上这个键值增加了不必要个空间耗费?
这点不对把。
a= b[i];如果b[i]不存在,会出现增加一个b[i]? 这样的结果不可以预道,就是a的值不可以预期。
zteliubin 2003-06-18
  • 打赏
  • 举报
回复
最好不用,可以也只能说是运气好,
浮点数用科学计数法表示,和精度有关,所以比较时有问题,
到时候改起来就麻烦了。
Leon8086 2003-06-18
  • 打赏
  • 举报
回复
对于float和double这种类型,最好不要使用==判断是否相等,但很明显find函数使用的是==运算符。
alongzju 2003-06-18
  • 打赏
  • 举报
回复
答案应该是这样的:
如果一个double t=1.23,把t放进去,然后去找t,那是肯定没有问题的。
但是如果你是f=a*b/c...就是f是经过复杂的运算的结果,这个结果也是1.23,但是有可能找不到的,因为这里的1.23可能和上面的1.23不是同样的表示。
其实所有有关double的东西都应该在一定的精度限制下来考虑。
fengfeng2003 2003-06-18
  • 打赏
  • 举报
回复
To fangrk(加把油,伙计!)

我的意思是
你在map里面放入一对数:
例如:1.23 5.6
放入的是1.23 在map里面很可能是1.23000001 5.5999999
此时key变为1.230000001而不是1.23
这样的话,find(1.23)还行吗?
fangrk 2003-06-18
  • 打赏
  • 举报
回复
用map的find函数能找到匹配的值吗?——什么意思?没多大懂


#include <iostream>
#include <map>
using namespace std;
int main()
{
map<double,double> DoubleMap;
DoubleMap[1.23]=3.2;
DoubleMap[4]=5.32;
DoubleMap[3.14]=88.3;
DoubleMap[7.0]=24.34;
DoubleMap[9.87]=89.2;
DoubleMap[6.66]=0.23;

map<double,double>::const_iterator Find=DoubleMap.find(3.14);
if(Find==DoubleMap.end()) DoubleMap[3.14]=99.99;
else cout<<Find->second;
}
slavik 2003-06-18
  • 打赏
  • 举报
回复
map <Key, T, Compare, Allocator> gives fast access to stored values of type T that are indexed by unique keys of type Key
. The default operation for key comparison is the < operator.
slavik 2003-06-18
  • 打赏
  • 举报
回复
在c++builder的help里的原文
operator[](const key_type& x);

If an element with the key x exists in the map, then a reference to its associated value is returned. Otherwise the pair x,T() is inserted into the map and a reference to the default object T() is returned.

所以如果没找到键值,就会插入一个默认的T对应这个键。
alongzju 2003-06-18
  • 打赏
  • 举报
回复
错了,find函数使用的是<操作符,而不是==操作符。
map是红黑树实现的。
陈硕 2003-06-18
  • 打赏
  • 举报
回复
a = b[i];
如果 key i 不存在,那么确实会增加一个以 i 为 key 的 pair,其 value 为 data_type 的默认值。
所以a的值可以预期,如果data_type为double,那么 a == 0。

添加新值是operator[]的副作用,如果只是查找,可用map::find()

alongzju 2003-06-17
  • 打赏
  • 举报
回复
map是通过<操作符比较的,用double可能会有问题。
两个double是否相等要看在怎么样的精度下,一般是自己指定一个精度,只要重载<就OK。
slavik 2003-06-17
  • 打赏
  • 举报
回复
不能吧
map是通过pair< t1, t2 >来检索的
办断时用的是pair类的==比较
而且更可怕的是用[]查找时如果不存在会自动加上这个键值增加了不必要个空间耗费
fangrk 2003-06-17
  • 打赏
  • 举报
回复
can

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧