带有自定义排序的C ++地图中的唯一索引

时间:2013-09-01 08:04:34

标签: c++ sorting map

我有std::map这样的自定义键:

struct Foo
{
    Foo(int _uid, int _priority) : unique_id(_uid), priority(_priority) {}

    bool operator<(const Foo& other) const {    
        return priority < other.priority;       
    }

    int unique_id;
    int priority;
};

我正在使用以下代码创建地图:

std::map <Foo, int> bla;

这就是我插入项目的方式:

bla.insert(std::pair<Foo, int> (Foo(1,2), 3) )

这很好用,排序也可以。但我的问题是,如何才能通过unique_id找到一个项目? find功能需要Foo,这需要priority,我在查询时没有这个功能。

我更想将优先级存储在值中(而不是键),但我不知道如何按值排序。 std::map是正确的类/模板吗?

编辑:我没有能力使用提升,优先级也不是唯一的。

4 个答案:

答案 0 :(得分:3)

  

如何仅通过unique_id找到项目?

这个问题的问题是该列表包含Foo个类并按优先级排序。这使得按unique_id搜索项目成为问题。

我建议的是创建一个新的std::map

std::map <int, foo> uniqueId_To_FooClass;

在向bla添加新项目时,请将其添加到uniqueId_To_FooClass。这样,您可以按foo

找到unique_id班级
  

我更想将优先级存储在值中(而不是键),但我不知道如何按值排序。 std :: map是正确的类/模板吗?

据我所知,std::map将为您提供迭代器,该迭代器将遍历按键排序的项目。只能通过值来浏览已排序的项目,并仍然使用地图,是将整个集合重写为另一个地图,键和值相反。

您还可以查看Oli Charlesworth回答中的here

答案 1 :(得分:2)

如果您对线性搜索没问题,那么您可以使用std::find_if

auto it = std::find_if(bla.begin(), bla.end(), 
                       [given_id](std::pair<Foo, int> const & p)
                        {    
                            return p.first.unique_id== given_id;
                        });

if (it != bla.end() )
       //found

希望有所帮助。

答案 2 :(得分:1)

我认为std :: map不是正确的选择(优先级是唯一的?)。我建议使用“The Boost Multi-index Containers Library”(http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/index.html

答案 3 :(得分:1)

如果您只需要搜索unique_id,则可以

类似于find_if,您可以在== struct

中使用自定义Foo
   bool operator ==(const Foo& other) const {    
        return unique_id == other.unique_id;       
    }

然后是这样的事情

int search_id =12;
Foo f ={search_id,6};
std::map <Foo, int>::iterator it=bla.begin();
for(;it!=bla.end();++it)
  if(it->first == f){
    std::cout<<"Found !";
    break;
  }