0
class compare
{
    public:
    bool operator()(const int x,const int y) const
    {
        if(x-y == 0) 
            return false;
        else 
            return true; 
    }
};

int main()
{
    std::map<char,int,compare> mymap;

    //Add data into map
    mymap.insert ( std::pair<char,int>('f',100) );
    mymap.insert ( std::pair<char,int>('a',100) );
    mymap.insert ( std::pair<char,int>('k',100) );
    mymap.insert ( std::pair<char,int>('z',200) );

    //try to find a key in map
    std::map<char,int,compare>::iterator l_pos = mymap.begin();
    l_pos = mymap.find('z');

    if(l_pos != mymap.end())
    {
        printf("\nfound = %c\n",l_pos->first);
    }
    else
    {
        printf("Not found = %c\n",l_pos->first);
    }
}

结果:

Not found =

但是如果我显示地图,我可以看到内容。mymap 包含:f => 100 a => 100 k => 100 z => 20

当编写自定义比较函数以阻止键排序时,在 stl 映射中查找不起作用。查找失败。有没有办法来解决这个问题?Find 不返回任何数据。我知道 stl 地图不是为了这个目的。但是有没有办法解决这个问题?比较函数停止排序。条目以相反的顺序存储。当我使用 for 循环遍历地图时,我可以看到所有值。只有 find 命令不起作用。

4

2 回答 2

1

你的compare函子坏了。

Amap使用比较器来实现严格的弱排序。

23.1.2 关联容器

每个关联容器都在 Key 和一个排序关系 Compare 上参数化,该排序关系对 Key 的元素产生严格的弱排序 (25.3)。

您的compare()函数不这样做,因此会导致未定义的行为。这不是map在这里被破坏,而是你使用它,所以除了重新实现compare()以对元素产生严格的弱排序或使用map.

于 2013-05-29T13:48:01.420 回答
0

std::map 要求您的比较运算符实现严格的弱排序,并且如果比较器未实现这些要求,则行为未定义。你不能让你的地图与你的比较一起工作。

也许如果您更详细地了解您要解决的实际问题,我们可以为您提供帮助。

于 2013-05-29T13:47:05.270 回答