2012-11-14 151 views
0

我想隨機分配給boost :: ptr_vector。如果在正常的STL矢量我這樣做:隨機分配給boost :: ptr_vector

class A{ 

}; 

A* a1 = new A(); 
A* a2 = new A(); 

vector<A*> normal_vec; 
normal_vec.resize(2); 
normal_vec[1] = a1; 
normal_vec[0] = a2; 

我試圖做同樣的的boost :: ptr_vector:

A* a1 = new A(); 
A* a2 = new A(); 

ptr_vector<A> boost_vec; 
boost_vec.resize(2); 

boost_vec[1] = a1; 
boost_vec[0] = a2; 

,但我得到以下錯誤:

no match for ‘operator=’ in ‘v.boost::ptr_vector<A>::<anonymous>.boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::operator[] [with T = A, VoidPtrSeq = std::vector<void*, std::allocator<void*> >, CloneAllocator = boost::heap_clone_allocator, boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::reference = A&, boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::size_type = long unsigned int](1ul) = a1’ 

但我正在努力解決這個問題

+0

另請參閱:http://stackoverflow.com/questions/13367079/how-to-randomly-assign-to-vector-in-c –

+0

看起來像你一直沒有讀過您正在使用的類型的文檔。 –

+1

您的'std :: vector'示例不是通常添加到'vector'的示例。使用'push_back'(在可選地調用'reserve'後)而不是'operator []'。 – Praetorian

回答

2

您應該使用ptr_vector<T>::replace而不是operator[]operator[]返回T&而不是T*&,因此您只能分配值而不是指針。

還要注意的是,你有內存泄漏時a2第二new拋出,a1不會在下面的代碼刪除:

A* a1 = new A(); 
A* a2 = new A(); 

考慮使用std::unique_ptr

+0

ahh,謝謝我會接受一旦計時器耗盡 – Aly

+0

對不起,你能澄清內存泄漏嗎?這只是在第一個代碼塊嗎?如果是這樣,我明白了。如果它在第二個代碼中被阻止,我感到困惑,因爲我認爲ptr_vector處理刪除 – Aly

+0

他意味着當分配'A * a2 = new A()'時,如果分配失敗,那麼沒有辦法將第一個分配' A * a1 = new A()'將被代碼刪除,因爲它沒有被處理。因此他建議使用智能指針的原因。但是,如果這是一個小應用程序,那麼你不必擔心這些東西,儘管你通常應該使用智能指針,在程序退出後,任何未被刪除的分配將被操作系統照顧。 – dchhetri

0

另請注意,您的程序有一個錯誤。從0開始索引編號不是1.

+0

謝謝,是一個類型應該是v [1],v [0](我想他們是失序) – Aly