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