我有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;
}
有没有更有效的方法来获得收藏?
答案 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;
});
现在您不必使用sort
或unique
。
答案 1 :(得分:2)
从算法上讲,这已经是最有效的方法了。像sort和unique这样的批量操作几乎总是胜过在线操作,例如通过常数因素设置插入。
也就是说,当性能关键时,通常建议远离基于节点的容器,如列表,映射和设置。您可以切换到std::vector
,std::sort
和std::unique
,但在您的示例中,这可能不会更快,因为移动字符串实际上可能比重新排列列表节点慢。如果您有移动支持且没有活动的小字符串优化,那么可能值得一试。