簡體   English   中英

2d矢量初始化

[英]2d Vector Initialization

我放棄了嘗試將2d數組傳遞給函數,其中維度在編譯時是未知的。 經過一些研究,似乎二維矢量可能是一個很好的替代品。 我只想確認這是聲明一個維度totalRows X totalColumns的二維向量的正確方法,初始化每個單元格以包含空格字符:

vector<vector<char> > world(totalRows, vector<char>(totalColumns, ' '));

線本身應該工作,看起來很好。 但是,讓我提供更多信息。

嘗試使用標准庫是個好主意。 話雖如此,你需要了解你頭腦中的2D陣列圖像必須在內存中線性存在。 您可以輕松地創建一個字符的m * n元素向量(在您的示例中),並將其作為行(主要是明確的)索引為(i * n + j)(由零基計數提供)。

事實上,這就是“二維”陣列的工作方式。 例如,當你做一個常規的元素數組T[][] ,如果你試圖將它衰減成一個指針,它將是一個簡單的T* 在引擎蓋下,記憶是連續和線性布局的,沒有形狀,只有一條長街(就像計算機看到的那樣)。 它只是通過使用第一段中的表達式(或類似的)來推斷行和列的概念。 電腦不關心。

vector是標准庫的一個很好的部分,它以一種簽名C ++(而不僅僅是膨脹的C)的方式封裝數組。 它的設計使得內部陣列數據結構的調整變得容易,隨着C ++ 11的出現,移動語義可以調整更便宜的操作。 此外,RAII的概念在這里適用,在構造函數中仔細初始化數據成員並在析構函數中釋放它們的想法使您能夠避免作為用戶的動態內存分配問題,並簡單地在堆棧上傳播新對象,在需要時傳遞引用“退出“他們的范圍。

需要注意的一點是, vector s創建了一個內部內存塊,這個數組可能會超過實際數組的大小,因為彈出和推送新元素。 此外,您最初沒有義務定義它的大小,但可以通過push_back,push_front等輕松擴展它。這意味着其他東西可以隨時改變並且擴展可能會花費你很多,即使使用移動語義。

偏離矢量的唯一原因是當你正在進行一些重型3D渲染或數據導向的模擬時,期望數據以一些非常自定義的特定方式打包並且手動改組,整齊的vector可能不容易允許。 但這將推動你進入更低級別的裸陣列領域(你應該為此做好准備)。 你應該從中得到的關鍵是你可以簡單地將“心理二維數組”向量(實際上,數據沒有真正的幾何形狀,這就是我們如何,微不足道的人,看到它)作為向量處理,並且只是對它們進行不同的索引。 確保按順序逐個輸入所有行數據,你將得到一個非常簡單的布局,可以用(i * n + j)簡單地探測/索引,其中[i,j]是經典的2D矩陣下標/索引。

然后,它可以很簡單:

vector<char> world(totalRows*totalColumns, ' ');

然后你只需通過引用傳遞它需要去的地方,在正確推送數據之后將其索引為(i * n + j)。

你的代碼應該可以運行,但是不必要的膨脹可能會在嘗試操縱你的數據,轉移它並編寫不必要的東西時引入不必要的心理開銷,遠遠低於實際使用i * n + j“手動索引”方法來保持你的心理狀態一個二維陣列/字符的字符。 如果您願意,您甚至可以覆蓋功能以添加語法糖。

你的代碼有效。 正如評論中所注意到的那樣, vector<vector<T>>並不是真正的2D數組。

這里重要的是(totalRows, vector<char>(totalColumns, ' '))(totalColumns, vector<char>(totalRows, ' '))是等效的,只要您始終遵循用於創建矢量: line x column (或column x line

暫無
暫無

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

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