簡體   English   中英

在 C++ 中初始化二維向量的問題

[英]Problem with initialising 2D vector in C++

我正在為這個問題實施一個解決方案,以了解該語言。 我的推理如下:

  1. 請注意,對角線上的圖案是2*n+1

  2. 左邊和上面的元素是從對角線到邊界的元素的交替等差數列或加法/減法。

  3. 創建一個二維向量並實例化所有對角線元素。 然后創建一個虛擬變量以通過添加/減去對角線元素來填充剩余部分。

我的代碼如下:

#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 的內存。

考慮如何填充正方形。 如果您選擇給定xy之間的最大值(稱為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.

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