c ++ map中的关键比较不起作用

时间:2010-08-13 21:37:45

标签: c++ map

我创建的地图以ClassExpression为键,std::string为值。关键比较器如下所示

class ClassExpressionComparator {
public:
    bool operator()(const ClassExpression& lhs,
    const ClassExpression& rhs) const {
           return ((lhs.quantifier == rhs.quantifier) &&
                   (lhs.property.compare(rhs.property) == 0) &&
                   (lhs.concept.compare(rhs.concept) == 0));
    }
 };

ClassExpression包含比较器中提到的3个字段。我比较了所有3个领域。当我使用map的find()时,即使地图中没有键,它也会发现它找到了键并给出了一个现有的键作为结果(得到第一个键作为结果)。

我尝试了以下

boost::shared_ptr< std::map<ClassExpression, std::string, 
ClassExpressionComparator> > cemap(
                new std::map<ClassExpression, 
                std::string, ClassExpressionComparator>());
ClassExpression ce1;
ce1.quantifier = com::xxxx::kb::SOME;
ce1.property = "<http://www.w3.org/2002/07/acts-on>";
ce1.concept = "<http://www.w3.org/2002/07/Tissue>";
populateMap(cemap, ce1);

ClassExpression ce2;
ce2.quantifier = com::xxxx::kb::SOME;
ce2.property = "<http://www.w3.org/2002/07/contained-in>";
ce2.concept = "<http://www.w3.org/2002/07/HeartValve>";
populateMap(cemap, ce2);

ClassExpression ce3;
ce3.quantifier = com::xxxx::kb::SOME;
ce3.property = "<http://www.w3.org/2002/07/has-location>";
ce3.concept = "<http://www.w3.org/2002/07/Endocardium>";

std::map<ClassExpression, std::string, ClassExpressionComparator>::iterator
                       ceIterator = cemap->find(ce3);
if (ceIterator == cemap->end()) {
         std::cout << "Not found" << std::endl;
}
else {
     std::cout << "Found; concept = " << ceIterator->second << std::endl;
}
ClassExpressionComparator cmp;
std::cout << "compare: " << cmp(ce1, ce3) << std::endl; 

populateMap()只是插入,在我的实际代码中,我做了一些其他的事情,我想保持相同的流程,所以就这样离开了。 cmp(ce1, ce3)的输出为0但是当我执行find(ce3)时,结果是它在第一个关键位置找到它而不是返回end()。我在哪里错了?

谢谢。

Raghava。

2 个答案:

答案 0 :(得分:8)

你写了一个平等比较。 map需要小于比较。 (或者如果您希望按键递减顺序,则大于。)

我这样做的习惯用语:

bool operator()(const ClassExpression& lhs,
const ClassExpression& rhs) const {
       return lhs.quantifier < rhs.quantifier? true
            : rhs.quantifier < lhs.quantifier? false
            : lhs.property.compare(rhs.property) < 0? true
            : lhs.property.compare(rhs.property) > 0? false
            : lhs.concept.compare(rhs.concept) < 0;
}

答案 1 :(得分:2)

map是一个已排序的容器,它正在寻找的比较运算符是一个实现严格弱排序的运算符,如<。你给它一个等于运算符,这将搞砸订单。