容器订购要求(努力理解boost :: multi_index)

时间:2016-10-06 20:42:19

标签: c++ stl boost-multi-index

给出一些建模为:

的东西
struct Foo { int id; std::string name; };

其中id是唯一的,name是非唯一的/非{null |空}。

如何使用像boost :: multi_index这样的数据结构,这样我就可以完成以下操作:

select id, name from Foo group by name order by id

标准的STL容器没有让我到达承诺的土地。我使用上面的sql变体只是为了得到我的观点。我并没有真正处理任何数据库。

更新:

所以,显然我只需要:

typedef boost::multi_index_container<
  Foo,
  indexed_by<
    ordered_unique<identity<Foo>>,
    ordered_unique<member<Foo, std::string, &Foo::name>>
  >
> MIC;

有人可以证实我有这个权利吗?它似乎工作。我还没有测试过它。

1 个答案:

答案 0 :(得分:0)

在使用boost方面,我并没有那么多使用它,但我认为这不是必要的,这取决于你需要这种操作的效率。

如果您有Foo的标准库容器,为简单起见,我们假设为std::vector<Foo>。您可以执行以下操作:

std::string nameToSearchFor( "Bar" );
std::vector<Foo> vecFoos;
std::vector<Foo> results;
auto it = std::find_if( it, vecFoos.cend(), [&]( const Foo& foo ) {
   return (foo.name == nameToSearchFor);
});

while (it != vecFoos.cend())
{
   results.emplace_back( *it );

   it = std::find_if( it, vecFoos.cend(), [&]( const Foo& foo ) {
       return (foo.name == nameToSearchFor);
   });
}

std::sort( results.begin(), results.end(), []( const Foo& lhs, const Foo& rhs ) {
    return lhs.id < rhs.id;
});

这适用于任何STL容器,或至少提供对其元素的ForwardIterator访问的任何容器。但是,如果您使用std::unordered_multimap之类的内容,则需要利用其内部find / equal_range方法。

有很多方法可以加快速度,但这是一种天真,快速且易于理解的方法,可以为您提供所需的信息,并且应该适用于小型数据集。