簡體   English   中英

參考2d向量中的元素(c ++)

[英]Reference to element in 2d vector (c++)

我在粒子系統中有一個名為Spring的類。 構造函數看起來像:

Spring(Particle& _a, Particle& _b);

我有一個粒子矢量,我使用

Spring mySpring = Spring(myParticles.at(j),myParticles.at(j+1));

在一個循環內部,在兩個粒子之間增加一個彈力。 到目前為止一切正常。 但是,我想使用粒子的2d矢量。 那是:

Spring mySpring = Spring(myParticles.at(i).at(j),myParticles.at(i).at(j+1));

而且我沒有得到粒子的參考。 在第一個例子中,每當我在spring類中更改粒子時,向量中的粒子都會發生變化。 在第二個示例中,更改僅在本地進行。 如何更改2D矢量中的粒子?

編輯:我試着說清楚一些事情:

我有一些粒子系統,每個粒子系統都由許多粒子組成。 每個粒子只應與其自身處於同一系統中的其他粒子相互作用。 因此,我有一個粒子系統向量,每個粒子系統都是粒子對象的向量。 (這使得2d矢量)。 第一維(i)是系統,第二維(j)是單個粒子。 系統中的粒子相互作用(碰撞,避免,等等......)並且它們的位置發生變化。 矢量得到“更新”。 (即參考作品)。

但是,我有第二個(1d)彈簧力矢量。 彈簧力也用於更新顆粒的位置。 我的構造函數執行以下操作:

Spring::Spring(Particle& _a, Particle& _b) {
    a=&_a;
    b=&_b; }

a和b是粒子*。 所以我存儲指向2d向量中的兩個粒子的指針。 另一個函數Spring.doSpring()改變了粒子的位置。

a->pos.x=300;

要么

a->velocity+=something..

在我發布的第一個例子中,我只使用了一個粒子系統,因此不需要二維矢量。 一切正常。 向量中的粒子得到更新。 但是第二個例子我的程序運行但不管doSpring函數做了什么,2d向量中的粒子都沒有得到更新。

采用引用/指向向量內部元素的最常見問題之一是重新分配。 例如,如果你使用push_back,那么向量將超過其容量,分配一個新的內存塊,復制所有內容,然后釋放舊塊。 如果您已經對向量中的元素進行了引用或指針,那么它們仍然指向舊塊,現在是死記憶,並且是一個嚴重的錯誤!

所以我猜你的粒子效應會不斷向你的粒子向量添加新的粒子,這在某些時候會導致向量在超出容量時重新分配。 Spring類存儲的指針雖然沒有更新,但是指向死記憶並且對實際粒子沒有影響,實際粒子被矢量移動到其他地方。

不要將引用或指針指向向量內的元素。 使用指針,列表或其他容器的向量,它不會在實際元素的內存地址周圍移動。 如果必須,請使用迭代器到向量內的元素。 在調試版本中,假設您已經檢查了STL實現,如果在向量重新分配自身后通過迭代器訪問該元素,您將獲得調試警報。

你正在做什么看起來沒問題 - 下面的代碼創建一個“2D”向量,並說明.at()。at()構造確實給你一個引用:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector <vector<int> > vi;
    vi.push_back( vector <int>() );
    vi.at(0).push_back( 42 );
    cout << vi.at(0).at(0) << endl;    // prints 42
    vi.at(0).at(0) = 666;
    cout << vi.at(0).at(0) << endl;    // prints 666
}

我認為C ++ FAQ Lite中的這個系列應該有所幫助。

請不要被“運算符重載”標題混淆。 你絕對應該從那里閱讀13.10,13.11和13.12。

如果我理解正確你想使用std::vector創建一個粒子的2D數組?

如果是這樣,您可以將其聲明為: std::vector<std::vector<Particle> > 然后你甚至可以使用[][]命名法來訪問元素。 Danger Will Robinson!使用此運算符時無邊界檢查

但是,如果這個2D數組主要包含零,則可以使用帶索引的map作為鍵。

暫無
暫無

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

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