当我尝试在自定义有序集中查找元素时遇到问题。

File: c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree
Line: 1746

Expression: invalid operator<


我需要一组字符串,其中的元素按照我的需要进行排序。

比较器对象:

struct OrderComparator {
public:
    static map<string,int> valueOrder;

    bool operator()( const string lhs, const string rhs ) {
        map<string,int>::iterator resultLhs,resultRhs;
        resultLhs = valueOrder.find(lhs);
        resultRhs = valueOrder.find(rhs);
        if (resultLhs == valueOrder.end() || resultRhs == valueOrder.end())
        {
            return false;
        }
        else {
            bool result = resultLhs->second <= resultRhs->second;
            return result;
        }
    }

    static map<string,int> create_map()
    {
        map<string,int> m;
        m["A"] = 1;
        m["B"] = 2;
        m["C"] = 3;
        m["D"] = 4;
        return m;
    }
};




比较器工作正常!

但是,当我尝试搜索集合中提到的错误时。

typedef set<string, OrderComparator> TREESET_CMP;
...
TREESET_CMP::iterator it = myTree.find(obj); <-fails
...


如果有人可以告诉我为什么会发生这种情况以及如何解决它,我们将很高兴。



完整的迷你示例:

    #include "stdafx.h"
#include <string>
#include <set>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
#include <stdio.h>
#include <tchar.h>

struct OrderComparator {
public:
    static map<string,int> valueOrder;

    bool operator()( const string lhs, const string rhs ) {
        map<string,int>::iterator resultLhs,resultRhs;
        resultLhs = valueOrder.find(lhs);
        resultRhs = valueOrder.find(rhs);
        if (resultLhs == valueOrder.end() || resultRhs == valueOrder.end())
        {
            return false;
        }
        else {
            bool result = resultLhs->second <= resultRhs->second;
            return result;
        }
    }

    static map<string,int> create_map()
    {
        map<string,int> m;
        m["A"] = 1;
        m["B"] = 2;
        m["C"] = 3;
        m["D"] = 4;
        return m;
    }
};
map<string,int> OrderComparator::valueOrder = OrderComparator::create_map();

typedef set<string, OrderComparator> TREESET_CMP;

int _tmain(int argc, _TCHAR* argv[])
{
    TREESET_CMP myTree;
    myTree.insert("B");
    myTree.insert("C");
    myTree.insert("A");

    TREESET_CMP::const_iterator it = myTree.find("A");
    system("PAUSE");

}

最佳答案

您的比较器可以是:

bool operator()( const string &lhs, const string &rhs ) {
    map<string,int>::iterator resultLhs,resultRhs;
    resultLhs = valueOrder.find(lhs);
    resultRhs = valueOrder.find(rhs);
    if (resultLhs == valueOrder.end()) return false;
    if (resultRhs == valueOrder.end()) return true;

    return resultLhs->second < resultRhs->second;
}


您可以将2行替换为:

if (resultRhs == valueOrder.end()) return false;
if (resultLhs == valueOrder.end()) return true;


如果要在此之前对地图中不存在的字符串进行排序。

10-07 23:33