簡體   English   中英

矢量的指針

[英]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> >

但它實際上取決於:

  • 你的意圖
  • 如果有必要共享數據
  • 如果“baddie”構建/復制真的那么昂貴

此外:您應該使用初始化列表來初始化您的成員:

Class:Class(vector<baddie> input)
: baddies( input ) 
{}

這是一種不好的方法,因為首先它將向量復制到構造函數然后將其復制到名為baddies的向量,在這種情況下,最好將輸入作為引用然后將其復制到baddies。 如果你想控制副本,那么你可以考慮遍歷輸入向量並將每個值推送到baddies向量。 如果你想獲得更快的速度,那么你可以將baddies向量和輸入向量都聲明為指針,然后將壞人指向輸入向量來自的位置。 這有點讓它使用起來有點難看,因為如果用[]索引向量,那么你將首先索引指針,所以你必須將它索引兩次才能到達向量,如下所示:

baddies[0][i];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM