[英]Problem with initialising 2D vector in C++
我正在為這個問題實施一個解決方案,以了解該語言。 我的推理如下:
請注意,對角線上的圖案是2*n+1
。
左邊和上面的元素是從對角線到邊界的元素的交替等差數列或加法/減法。
創建一個二維向量並實例化所有對角線元素。 然后創建一個虛擬變量以通過添加/減去對角線元素來填充剩余部分。
我的代碼如下:
#include <vector>
using namespace std;
const long value = 1e9;
vector<vector<long>> spiral(value, vector<long> (value));
long temp;
void build(){
spiral[0][0] = 1;
for(int i = 1; i < 5e8; i++){
spiral[i][i]= 2*i+1;
temp = i;
long counter = temp;
while(counter){
if(temp % 2 ==0){
spiral[i][counter]++;
spiral[counter][i]--;
counter--;
temp--;
}else{
spiral[i][counter]--;
spiral[counter][i]++;
counter--;
temp--;
}
}
}
}
int main(){
spiral[0][0] = 1;
build();
int y, x;
cin >> y >> x;
cout << spiral[y][x] << endl;
}
問題是程序不輸出任何東西。 我不明白為什么我的向量不會打印任何元素。 我已經用spiral[1][1]
對其進行了測試,等待 5 或 10 分鍾后,我得到的只是一些晦澀的匯編消息。 我的推理有什么問題?
編輯:完整輸出是:
和
對於您來說, long
可能是 4 或 8 個字節(例如,通常在 Windows 上為 4 個字節,在 x86 Linux 上為 4 個字節,在 x64 Linux 上為 8 個字節),因此讓我們假設 4. 1e9 * 4
是每個vector<long> (value)
4 GB 連續內存vector<long> (value)
。
然后外部向量創建另一個1e9
副本,這是 4 1e9
字節(或 400 1e9
兆字節),給定 32 位長或 64 位雙倍,並忽略每個std::vector
的開銷大小。 您不太可能擁有那么多內存和交換文件,並且在調用 main() 之前嘗試將其設為全局。
因此,您將無法直接存儲所有這些數據,您需要考慮實際需要存儲哪些數據才能獲得所需的結果。
如果您在設置為停止異常的調試器下運行,您可能會看到std::bad_alloc
被拋出,調用堆棧指示原因(例如,Visual Studio 將在調用堆棧中顯示類似“'spiral'的動態初始化程序”的內容),但在 Linux 上操作系統可能會先殺死它,因為 Linux 可能會過度使用內存(所以new
等成功),然后當某個程序開始使用內存(實際讀取或寫入)時,它會失敗(超過提交,沒有什么免費的)並且它 SIGKILL 是釋放內存的東西(這似乎並不完全可以預測,我將您的代碼復制粘貼到 Ubuntu 18 上,並且在命令行上“在拋出一個‘std::bad_alloc’實例后被終止調用” )。
在這里,數學是你的朋友,而不是std::vector
。 這個謎題的一個限制是 512MB 的內存限制,但是一個足夠大的向量進行所有測試需要幾 GB 的內存。
考慮如何填充正方形。 如果您選擇給定x
和y
之間的最大值(稱為w
),您就“分隔”了一個大小為 w 2的正方形。 現在您必須考慮這個正方形的外邊緣才能找到實際的索引。
例如,取 x = 6 和 y = 3。最大值是 6(偶數,記住鋸齒形圖案),所以數字是 (6 - 1) 2 + 3 = 28
* * * * * 26 * * * * * 27 * * * * * [28] * * * * * 29 * * * * * 30 36 35 34 33 32 31
在這里,一個概念證明。
該問題實際上要求您找到解決方案的分析公式,而不是模擬模式。 您需要做的就是仔細分析模式:
unsigned int get_n(unsigned int row, unsigned int col) {
assert(row >= 1 && col >= 1);
const auto n = std::max(row, col);
if (n % 2 == 0)
std::swap(row, col);
if (col == n)
return n * n + 1 - row;
else
return (n - 1) * (n - 1) + col;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.