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

您可以使用 a std::set,它只允许唯一值,而不是 a 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;
               });

现在您不必使用sortor unique

于 2013-03-28T16:58:31.670 回答
2

从算法上讲,这已经是最有效的方式了。像 sort 和 unique 这样的批量操作几乎总是以常数因素胜过像 set-inserts 这样的在线操作。

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

于 2013-03-28T17:10:18.090 回答