2017-07-03 86 views
0

推動元件我試圖從2D整數矩陣推元件成一維整數vecto.While試圖推回來,如果我做(使用矢量的矢量創建):從2D到1D向量

//declarations 
//vector<vector<int>>nums 
//vector<int>ans;int a 
for(int i=0;i<nums.size();i++) 
    { 
     for(int j=0;j<nums[i].size();j++) 
     {   
       arr.push_back(nums[i,j]); 
     } 
    } 

我收到一個錯誤,因爲沒有匹配的函數調用。 但是,如果我這樣做:

for(int i=0;i<nums.size();i++) 
    { 
     for(int j=0;j<nums[i].size();j++) 
     {  a=nums[i,j]; 
       arr.push_back(a);  
     } 
    } 

它的工作原理。 據我所知,nums [] []正在作爲一個向量讀取,但不應該nums [i] [j]這是一個整數被讀取,因爲它不會引發錯誤。有人可以解釋兩種情況的區別嗎?

回答

3

這個問題的答案並不像看起來那麼簡單。讓我爲你分解它:

  • 在你的代碼中使用逗號時要小心! C++有它自己的規則comma operator,這意味着i,j被評價爲j,所以nums[i,j]等於nums[j]
  • 操作[]vector<vector<int>>返回此載體,它是vector<int>的元素類型的一個實例。訪問這個內部向量的元素可以通過再次使用[]運算符完成。
    因此,如果要訪問2d向量中的單個元素,首先必須選擇外部向量,然後選擇其內部元素,即 nums[i][j]
    C++沒有特殊的語法來訪問 多維數組/矢量!
+0

第一點是非常豐富,我不知道的東西! –

4

的語法,以置入到2維矩陣nums[i][j],而不是nums[i,j]

這是因爲operator[]std::vector超載是如何工作的。你可以提供一個單一的整數作爲參數,而不是一對,見http://en.cppreference.com/w/cpp/container/vector/operator_at

表達nums[i][j]首先評估作爲((nums[i])[j])其中內括號的計算結果爲在一個nums參照i個元素,這是vector<int>類型。然後第二個[j]評估爲內部向量的元素,即類型(可能是const限定的)的參考int&

+1

對最後一段的小意見不一致。這不是因爲'[]'是如何工作的,這是因爲'vector'總是1維的。 'vector > nums'是vector的矢量。第一個'[]'得到合適的內部'vector',第二個''從'vector'得到'int'。 – user4581301

+1

@ user4581301不算作爲*運算符[]重載如何爲'std :: vector' *工作? – Curious