STL map find 查找有关问题,来请问一下
STL map find 查找问题,高手进来请教一下map的key使用一个结构C/C++ codestruct Key{double xdouble y}/
STL map find 查找问题,高手进来请教一下
map的key使用一个结构
C/C++ codestruct Key{ double x; double y;}// 比较函数struct lessK{ bool operator()(const Key & k1, const Key & k2) const { if (fabs(k1.x - k2.x) < 0.02) { if (fabs(k1.y - k2.y) < 0.02) { return false; } else return k1.y < k2.y; } else { return k1.x < k2.x; } }};// 定义map为typedef map<Key, long, lessK> mKL;
使用map的find方法查找key时,不是%100的查找到了结果(可以确认要查找的key在map中存在)
在一次没有找到结果情况下跟踪查看,查找时第一次查找选取的key是最接近于要查找的key,
而符合结果的key在选取第一次查找的key的前面,在整个查找过程中就是没有对符合结果的key进行查找匹配
是否lessK存在缺陷?请高手指证!
[解决办法]less不光是用来查找的,插入时也会用。less返回值是不能含糊的,即:当less(a,b)=true时,less(b,a)一定要为false,否则这两个节点就会被当成相等的节点。就是说:abs或者stricmp之类的千万不要用。
如果在插入时都出错的话,比较当然就更不行了。因此建议lz的lessK改为一个返回值固定的函数 return k1.x == k2.x ? (k1.y < k2.y) : (k1.x < k2.x);
而在查找时使用stl的find_if函数,另写一个专为find_if使用的predit。
[解决办法]lz的意思是明白的。所以在插入和find时必须用不同的predit。
再叨唠两句:很多人认为less只影响比较结果(我以前也是),比如说,但我想写一个不区分大小写的字符串作key的map时就用stricmp就可以了,但实际上写出来的map不仅仅是不区分大小写比较,甚至也不仅仅是不区分大小写插入,它根本就是一个错误的map。
[解决办法]菜鸟学编程之C++/MFC: QQ群 41977413 C++/MFC编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加
菜鸟学编程之C/C# : QQ群 41976716 C/C#编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加
菜鸟学编程之VB/VBA : QQ群 20772662 VB/VBA编程开发技术群,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加
[解决办法]楼上说的很有道理