我有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
是正确的类/模板吗?
编辑:我没有能力使用提升,优先级也不是唯一的。
答案 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;
}