簡體   English   中英

C ++:在向量中插入什么 - 指針或引用,向量何時復制它的元素?

[英]C++: What to insert in vectors - pointers or references, when does a vector copy it's elements?

假設我有復雜的對象,比如包含大量成員的結構 - 我想將它們存儲在向量中。

現在,vector :: push_back(...)通過引用調用(而不是按值調用)工作,因此在第一時間不會復制傳遞的對象。 但是后來呢? 向量內部存儲指針或直接引用嗎? 當向量需要擴展時,包含的元素本身是復制還是它們的地址?

這最終導致了一個問題,如果 - 對於大型對象 - 對象本身應該存儲在向量中,或者指向這些對象的指針。 那有什么最好的做法嗎?

vector::push_back(...)通過引用調用(而不是按值調用)工作,因此在第一時間不傳遞傳遞的對象

vector::push_back()存儲要添加到其中的對象的副本。

向量內部存儲指針或直接引用嗎?

向量內部存儲元素的方式是實現細節,但復雜性和行為要求幾乎沒有變化的余地。 Vector將元素存儲在連續的內存位置,就像數組一樣。

當向量需要擴展時,包含的元素本身是復制還是它們的地址?

當向量擴展時,它需要將所有對象復制到新的連續內存,這也是一個實現細節。 如果元素是指針,則指針本身將被復制。

對象本身應存儲在向量中,或者指向這些對象的指針。 那有什么最好的做法嗎?

如果您的對象較大並且您不想將它們放在向量中,那么您可以在向量中存儲指針,但是不要將原始指針存儲在向量中,根據您的要求使用合適的智能指針 它確保完美的RAII ,您無需擔心存儲器管理。

std::vector::push_back保存對象的副本

如果你通過避免復制需要性能,那么你可以使用指針向量。

std::vector<BigObject*> objects; //manage memory yourself

或者您可以使用某種智能指針,以避免自己管理內存。 例如,如果編譯器支持std::unique_ptr則可以使用它:

std::vector<std::unique_ptr<BigObject>> objects;

如果你使用指針(或智能指針),那么復制仍然存在,但這一次,復制是針對指針(或智能指針)完成的,這要便宜得多。

來自@ Loki的評論:

或者您可以使用boost::ptr_vector<>來設計保存指針,並在訪問時返回引用,從而使標准算法變得容易,因為它們都期望對象。

實際上,如果你在向量上迭代而不是向它添加對象,那么通過添加對象將大大超過指針,因為它們在內存中是連續的。

但是,如果你正在向向量和向量進行更多的添加和擦除,那么與迭代它相比,指針將更有效。

暫無
暫無

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

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