对于shared_ptrs的random_shuffle向量是不好(甚至是危险的)?

时间:2015-06-16 19:57:53

标签: c++ vector shared-ptr smart-pointers shuffle

using namespace std;
vector< shared_ptr<MyObject> > objects;

// objects gets filled in by something

random_shuffle(objects.begin(), objects.end());

出于任何原因这是坏事还是低效?有没有更好的方法呢? (我希望我的智能指针数组随机排序)

编辑: 我问,因为会有很多交换,因为我不知道幕后的实现,我想知道是否有可能:

  • 许多引用计数可能像疯狂一样上下起伏,影响性能
  • 更糟糕的是,是否有可能导致内存泄漏的循环引用

2 个答案:

答案 0 :(得分:6)

不,这没有什么不好或效率低。

std::random_shuffle只能以随机方式交换投币器的元素。 std::swap专门用于std::shared_ptr,因此它与交换两对原始指针一样安全且高效,无需

  

许多参考计数可能像疯了一样上下起伏   影响绩效

即使没有这样的专业化,它仍然是安全和有效的,因为它只依赖于移动共享指针,而不是复制它们(并且移动std::shared_ptr不会影响参考柜台)。

至于循环引用,如果你有一些 - 它们仍然存在,如果你没有 - swap不能引入新的。

答案 1 :(得分:3)

std::random_shuffle用法的要求是元素应该是ValueSwappable并且容器应该具有random_access迭代器支持。 std::shared_ptr是ValueSwappable,std :: vector具有随机访问迭代器。因此它应该是安全的,并且不会在std::shared_ptr::use_count()中进行任何更改。

http://en.cppreference.com/w/cpp/concept/RandomAccessIterator

http://en.cppreference.com/w/cpp/concept/ValueSwappable