给出一些建模为:
的东西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;
有人可以证实我有这个权利吗?它似乎工作。我还没有测试过它。
答案 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
方法。
有很多方法可以加快速度,但这是一种天真,快速且易于理解的方法,可以为您提供所需的信息,并且应该适用于小型数据集。