簡體   English   中英

在矢量/列表中,您實際將它應用於對象嗎? (C ++)

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

這里cmyBlocks包含的值的副本

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.

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