2015-06-16 26 views
3
using namespace std; 
vector< shared_ptr<MyObject> > objects; 

// objects gets filled in by something 

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

由于任何原因,这是不好还是低效?有没有更好的方法来做到这一点? (我想我的智能指针阵列随机排序)shared_ptrs的random_shuffle向量是否坏(或者甚至是危险的)?

编辑: 我问,因为会有很多交换,并且因为我不知道幕后的实施,我想知道它是否它也许可以说:

  • 大量的引用计数可能会向上和向下像疯了似的,影响性能
  • 更有甚者,有可能导致内存循环引用的可能性泄密
+2

为什么它会是坏?你只是重新订购一个容器。你会担心什么会发生? – CoryKramer

+0

随机排序,你的意思是随机洗牌? – Steephen

+0

a。)它可能效率低下,每次指针被分配给彼此时,引用计数会增加和减少。或者b)也许循环引用可能会人为地增加引用计数,导致内存泄漏。我不知道,这就是为什么我问(我不确定发生了什么)。 – memo

回答

6

不在这里 在这方面没有什么不好或效率低下的。

std::random_shuffle只能以某种随机的方式交换cointainer的元素。 std::swap是专门为std::shared_ptr的,所以它是安全的,高效的交换2双生指针,没有

大量的引用计数可能会向上和向下像疯了似的, 影响性能

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

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

+0

假定平台具有一些超级有效的方式来交换'shared_ptr's,它不会与引用计数混淆。据我所知,没有C++ 11就无法保证。 –

+0

@DavidSchwartz我期望'std :: swap'专用于'shared_ptr',即使在pre-C++ 11的实现中也是如此。而且,嘿,已经是2015年了。 – lisyarus

+0

@DavidSchwartz“'shared_ptr'”...“不保证没有C++ 11”这是没有道理的,因为在pre-C++ 11中没有'std :: shared_ptr'。 –