[英]vector of pointers
如果我在類標題中有一個定義,例如:
vector<baddie*> baddies;
然后我在構造函數中初始化,如下所示:
Class::Class(vector<baddie*> input)
{
baddies = input;
}
我最終得到了什么? 有兩組指針指向對象的兩個向量?
簡單地指向原始矢量會更好嗎? 這甚至可能嗎?
或者更好的是在類中保存指針引用的向量,以便不重復指針? 訪問多個類中的對象和對象數組的最佳實踐是什么? 參考文獻? 指針? 指針引用? 先感謝您!
這取決於您要提供的語義。 在C ++ 11中,您可能想要做的是:
Class::Class( vector<baddie*> input ) : baddies( std::move(input) ) {}
這會將內存從參數中的副本 移動到成員,而在C ++ 03中你可能會寫:
Class::Class( vector<baddie*> const & input ) : baddies( input ) {}
這將使用副本初始化向量。
請注意,此討論僅涉及向量內容,而不涉及那些baddie
指針所指向的數據。 也就是說,在兩種情況下,都會有兩個帶有指針的向量來引用相同的元素(即內存中每個baddie
只有一個副本,兩個指針指向它)。
根據應用程序的語義,您可能希望從這個中間淺層復制到任一端:執行深層復制 (即在內存中創建新的baddie
元素,以便在構造函數完成后原始和副本完全無關)或避免應付在所有,只存儲一個參考/指針使得兩個矢量是完全一樣的 (內部或外部的類的插入將是可見的外部/里面的類)。
另外,要注意指針向量,需要在向量被破壞之前手動管理內存。
好吧,如果你想共享數據,我可能會使用std::vector< std::shared_ptr<baddie> >
或者a boost::shared_ptr< boost::ptr_vector<baddie> >
但它實際上取決於:
此外:您應該使用初始化列表來初始化您的成員:
Class:Class(vector<baddie> input)
: baddies( input )
{}
這是一種不好的方法,因為首先它將向量復制到構造函數然后將其復制到名為baddies的向量,在這種情況下,最好將輸入作為引用然后將其復制到baddies。 如果你想控制副本,那么你可以考慮遍歷輸入向量並將每個值推送到baddies向量。 如果你想獲得更快的速度,那么你可以將baddies向量和輸入向量都聲明為指針,然后將壞人指向輸入向量來自的位置。 這有點讓它使用起來有點難看,因為如果用[]索引向量,那么你將首先索引指針,所以你必須將它索引兩次才能到達向量,如下所示:
baddies[0][i];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.