3

我有一个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函数需要 a Foo,而这需要 a priority,而我在查询它时没有。

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

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

4

4 回答 4

3

如何仅通过 unique_id 找到项目?

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

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

std::map <int, foo> uniqueId_To_FooClass;

添加到bla新项目时,将其添加到uniqueId_To_FooClass. 这样你就可以找到一个foounique_id

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

据我所知,std::map将为您提供迭代器,该迭代器将遍历按键排序的项目。按值遍历排序项目并仍然使用映射的唯一方法是将整个集合重写到另一个映射,键和值颠倒。

您也可以在这里查看 Oli Charlesworth 的答案

于 2013-09-01T08:13:48.877 回答
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

希望有帮助。

于 2013-09-01T08:19:26.033 回答
1

我认为 std::map 不是正确的选择(优先级是唯一的吗?)。我建议使用“Boost 多索引容器库”(http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/index.html

于 2013-09-01T08:14:42.067 回答
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;
  }
于 2013-09-01T08:44:35.823 回答