在C ++`multimap`中,如何有效地获得没有重复项的`mapped_type`元素的集合?

时间:2013-03-28 16:53:30

标签: c++ list iterator unique multimap

我有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;
}

有没有更有效的方法来获得收藏?

2 个答案:

答案 0 :(得分: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;
               });

现在您不必使用sortunique

答案 1 :(得分:2)

从算法上讲,这已经是最有效的方法了。像sort和unique这样的批量操作几乎总是胜过在线操作,例如通过常数因素设置插入。

也就是说,当性能关键时,通常建议远离基于节点的容器,如列表,映射和设置。您可以切换到std::vectorstd::sortstd::unique,但在您的示例中,这可能不会更快,因为移动字符串实际上可能比重新排列列表节点慢。如果您有移动支持且没有活动的小字符串优化,那么可能值得一试。