[英]In a vector/list, are you actually applying it to the object? (C++)
假設我有一個向量:
vector<Block> myBlocks;
讓我們說我這樣做:
Block b(10); //Let's assume this will set b's variable: x to 10
myBlocks.push_back(b); //Add it to the vector/list
現在,如果我在其他地方做了這件事:
for(int i = 0; i<myBlocks.size(); i++){
Block c = myBlocks.at(i);
c.x = 15; //Will this work?
}
我放的地方: cx = 15;
,實際上是將該塊的x位置設置為15嗎? 或者只是將臨時塊的x位置設置為15? 如果它只設置臨時塊,我該如何為實際塊設置它?
Block c = myBlocks.at(i);
這里c
是myBlocks
包含的值的副本 。
Block& c = myBlocks.at(i);
這里c
是對 myBlocks
包含的值的引用 (即, 別名 )。
我懷疑你想要后者。
我把它放在:“cx = 15”,是否實際上將該塊的x位置設置為15?
沒有。
或者只是將臨時塊的x位置設置為15?
是。
如果它只設置臨時塊,我該如何為實際塊設置它?
myBlocks.at(i).x = 15 ; // Assuming x has a public access.
Block c = myBlocks.at(i);
myBlocks.at(i)
返回復制到c
的對象。 因此,對象(向量中的對象,c)是具有自己成員的兩個不同對象(假設類沒有原始指針)。
這將有效:
Block& c = myBlocks.at(i); // note reference here
c.x = 15; //Will this work?
你的也會工作但最后什么都不做。
你正在使用原始元素的副本。
我建議你更喜歡使用慣用iterator
:
for(std:vector<Block>::iterator it=myBlocks.begin(); it!=myBlocks.end(); it++)
{
it->x = 15 ;// this will work - will update the actual element, not its copy!
(*it).x = 15 ;// this will also work
}
C ++是一種基於復制語義的語言,所以當你做類似的事情時
Block c = myblocks.at(i);
你確實正在制作塊對象的副本。 請注意,這在C ++語言中並不稱為“臨時”... C ++中的臨時表是一個非常具體的術語,意思是自動創建並且未聲明的未命名對象。
這種復制行為與Python或Java等許多其他語言完全不同,后者的方法是參考語義 。
你可以要求不要通過使用“參考”明確地制作副本......
Block& c = myblocks.at(i);
在這種情況下,當你修改c
你正在使用向量中的原始元素。 請注意,在這種情況下,您必須注意保留引用的時間長度,因為例如,如果向向量添加元素,則所有現有引用和迭代器可能因向量重新分配而無效,並且使用它們將召喚可怕的未定義行為守護進程。
如果引用或迭代器無效或取決於容器的類型,在容器上進行的操作類型以及空間預留等事實,那么我的建議是閱讀一本好的C ++書來理解這些部分。
另請注意, std::vector::operator []
和std::vector::at
實際上都返回一個引用,因此您的代碼也可以使用更多succint和慣用語法更改向量中的原始對象
myblocks.at(i).x = 15;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.