大佬教程收集整理的这篇文章主要介绍了从容器中获取独特元素[E],大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>使用std :: unique
std::sort(srcContainer.begin(),srcContainer.end()); srcContainer.erase(std::unique(srcContainer.begin(),srcContainer.end()),srcContainer.end());
>使用BOOST :: unique
boost::erase(srcContainer,boost::unique<boost::return_found_end>(boost::sort(srcContainer)));
>我自己的方法
std::set<T> uniqueElems(srcContainer.begin(),srcContainer.end()); srcContainer.clear(); srcContainer.insert(srcContainer.end(),uniqueElems.begin(),uniqueElems.end());
1.和2.的问题在于它们改变了原始srcContainer中成员发生的顺序.使用3.顺序没有变化,而且与1和2相比,它提供了更好的性能(是因为上面没有明确的排序).上面3种方法的挂钟时间和srcContainer中的元素数量如下:
> srcContainer的大小(包含整数)= 1e 6
– std :: unique = 1.04779秒
– BOOST :: unique = 1.04774秒
– 自己的方法= 0.481638秒
> srcContainer的大小(包含整数)= 1e 8
– std :: unique = 151.554秒
– BOOST :: unique = 151.474秒
– 自己的方法= 57.5693秒
我的问题是:
>有没有更好的方法来查找使用std :: unique或BOOST :: unique或任何其他代码并保持容器中的原始顺序的唯一?
>使用上述方法3的任何问题.
对于性能分析,srcContainer创建如下:
std::vector<int> srcContainer; int halfWay = numElems/2; for (size_t k=0; k<numElems; ++k) { if (k < halfWay) srcContainer.push_BACk(k); else srcContainer.push_BACk(k - halfWay); }
编辑:
同意评论方法3.也改变了元素的顺序.有没有更好的方法来获得独特的元素而不改变秩序?
谢谢
struct Remover { explicit Remover(hash& found_items) : found_items_(found_items) { } bool operator()(const Iter& item) { retval = <does exist in hash>; add to hash; return retval; } hash& found_items_; }; hash dup_finder; Remover remover(dup_finder); std::erase(std::remove_if(src.begin(),src.end(),remover),src.end());
我的回答的原始组成部分:
如果源容器中的元素已经大部分已经排序,那么使用stable_sort可能会看到更好的性能,而不是在调用unique之前进行排序.如果没有关于yoru数据集的更多信息,我无法猜测可能导致选项3的性能优于1& 2.
选项3应该删除uniques但请记住,尽管你断言,它仍然会以与前两个选项完全相同的方式重新排序项目.
以上是大佬教程为你收集整理的从容器中获取独特元素[E]全部内容,希望文章能够帮你解决从容器中获取独特元素[E]所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。