c++ - shared_ptr 的 random_shuffle vector 不好(甚至危险)吗?

标签 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());

出于某种原因,这是否不好或效率低下?有更好的方法吗? (我希望我的智能指针数组随机排序)

编辑: 我问是因为会有很多互换,而且由于我不知道幕后的实现,所以我想知道是否有可能:

  • 许多引用计数可能会疯狂地上下波动,从而影响性能
  • 更糟糕的是,是否存在可能导致内存泄漏的循环引用

最佳答案

不,这并没有什么不好或低效的地方。

std::random_shuffle 仅以某种随机方式交换 cointainer 的元素。 std::swap 专门用于 std::shared_ptr,因此它与交换两对原始指针一样安全高效,无需

lots of reference counts could be going up and down like crazy, impacting performance

即使不存在这样的专门化,它仍然是安全和高效的,因为它只依赖于移动共享指针,而不是复制它们(并移动 std::shared_ptr 不影响引用计数器)。

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

关于c++ - shared_ptr 的 random_shuffle vector 不好(甚至危险)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30876981/

相关文章:

c++ - 单独线程中的两个窗口一起激活

用于比较的具有不同值的 C++ int 包装器类不起作用

c++ - 使用已删除的函数错误

c++ - 将成员函数指针的 vector 传递给函数

c++将 vector 规范化为 double ?

c++ - shared_ptr<T[]> 包装动态数组的问题

c++ - shared_ptr 如何处理到纯虚拟基类的复制?

c++ - 访问模板类型实例成员

c++ - 错误 : there are no arguments to 'at' that depend on a template parameter, 因此 at 的声明必须可用

c++ - C++11 中 shared_ptr 的原子操作