2

私はそのstd::multimap< int, std::string >ようなものを持っています:

1 A
1 B
1 C
1 B
1 C
1 C

mapped_type次のように、重複のない要素のコレクションを取得したいと思います。

1 A
1 B
1 C

私の解決策は次のとおりです。

#include <map>
#include <list>
#include <string>
#include <algorithm>

int main(int argc, char* argv[])
{
   std::multimap< int, std::string > mm;
   mm.insert( std::make_pair(1,"A") );
   mm.insert( std::make_pair(1,"B") );
   mm.insert( std::make_pair(1,"C") );
   mm.insert( std::make_pair(1,"B") );
   mm.insert( std::make_pair(1,"C") );
   mm.insert( std::make_pair(1,"C") );

   auto range( mm.equal_range(1) );

   std::list< std::string > ss;
   std::transform(range.first, range.second, 
                  std::back_inserter(ss), 
                  [](const std::pair<int,std::string>& p) {
                      return p.second;
                  });
   ss.sort();
   ss.unique();
   return 0;
}

コレクションを取得するより効率的な方法はありますか?

4

2 に答える 2

2

std::setの代わりに、一意の値のみを許可するを使用できますstd::list

std::set<std::string> ss;
std::transform(range.first, range.second, 
               std::inserter(ss, ss.begin()), 
               [](const std::pair<int,std::string>& p) {
                   return p.second;
               });

sortまたはを使用する必要がなくなりuniqueました。

于 2013-03-28T16:58:31.670 に答える
2

Algorithmically, this is already the most efficient way. Bulk operations like sort and unique almost always trump online operations like set-inserts by constant factors.

とはいえ、通常、パフォーマンスが重要な場合は、list、map、set などのノードベースのコンテナーを使用しないことをお勧めします。std::vectorstd::sortおよびに切り替えることもできstd::uniqueますが、この例では、文字列の移動は実際にはリストノードの再配置よりも遅くなる可能性があるため、高速ではない可能性があります。move-support があり、小さな文字列の最適化がアクティブでない場合は、試してみる価値があるかもしれません。

于 2013-03-28T17:10:18.090 に答える