2016-11-21 105 views
0

我正在寫一個代碼使用STL Vector類如何在STL向量矩陣中插入一個元素?

我矩陣是這樣創造adjacency_matrix:

vector<vector<float> > adjacency_matrix; 

我需要知道我可以在矩陣中插入新值,類似於到v [ X] [Y] = Z

我嘗試這種代碼,但它失敗:

adjacency_matrix.insert((adjacency_matrix.begin()+node1).begin()+node2,distance); 

我有這個

0 [] 7 9 2.6 0 [] 3.5 [] [] 0 [] [] [] [] 0

然後,我不得不插入(3,2)位置 12.5值的結果必須是這樣的:

0 [] 7 9 2.6 0 [] 3.5 [] [] 0 [] [] 12.5 [] 0

你能幫助我?

+5

[插入元件爲二維向量]的可能的複製(http://stackoverflow.com/questions/27241177/inserting-elements-into-2d-vector) –

+0

首先必須在創建一個項外部向量能夠在內部插入值。 –

+0

@ vidhu-gangvar沒有重複:我想在確定的位置添加一個新的元素,不僅添加這個 – AlmuHS

回答

1

std::vector是連續的,可調整大小的值數組。如果它之前沒有與之前的元素一起初始化,則不能訪問其第x個元素。這將是未定義的行爲。

所以,你應該事先創建整個矩陣這樣的:

size_t m_size = 10; 
std::vector<std::vector<float>> matrix(m_size, std::vector<float>(m_size, 0.0)); 
matrix[1][3] = 1.0; 
std::cout << matrix[0][0]; // 0.0 
std::cout << matrix[1][3]; // 1.0 

// still BAD, because we initialized only matrix of size 10; we could, however, expand it e.g. with vector::push_back 
matrix[13][0] = 2; // UB: crash 

如果你不能做到這一點,你可以使用std::map,它自動創建默認元素時operator[]被稱爲(然而要注意地圖實際上一棵樹,operator[]執行對數搜索,而不是矢量的持續訪問):

std::map<size_t, std::map<size_t, float>> matrix; 
matrix[0][1] = 3.0; 
std::cout << matrix[0][0]; // 0.0 
std::cout << matrix[0][1]; // 3.0 

如果未初始化的值是不確定的,你可以表達與如std::optional

std::map<size_t, std::map<size_t, std::optional<float>>> matrix; 
matrix[0][1] = 5.0; 
std::cout << matrix[0][0].value_or(127.0); // 127.0 
std::cout << *(matrix[0][1]); // 5.0 

if (matrix[14][27]) 
    std::cout << *(matrix[14][27]); 
else 
    std::cout << "not initialized"; 
+0

謝謝!我會試試看 – AlmuHS

0

正如評論中所述,您需要首先初始化您的「矩陣」。比你可以訪問的元素。 但要小心,你應該插入不在「矩陣」中的內部向量。另外begin()返回一個需要與->聯繫的迭代器。 如果您的「矩陣」已正確初始化,您還可以使用[]用於訪問,這更加可用。

#include <iostream> 
#include <vector> 
using namespace std; 

int main() { 
    vector<vector<float>> test(10,vector<float>(10)); 

    int x=1; 
    int y=2; 
    //access via iterator 
    auto inner_it =test.begin()+x; 
    inner_it->insert(inner_it->begin()+y,2.0); 
    cout<<test[x][y]<<"\n"; 
    // access via [] 
    test[y][x]=3; 
    cout<<test[y][x]; 
    return 0; 
} 

根據您的需要,最好使用線性代數庫(例如Eigen)。

+0

問題是我不知道矩陣的未來長度是什麼,所以我不能保證這是完全初始化的 – AlmuHS

+0

你可能會問一個[ XY問題](http://meta.stackoverflow.com/tags/xy-problem/info)。你想用矩陣實現什麼?也許你需要一個[稀疏矩陣](http://eigen.tuxfamily.org/dox/group__SparseQuickRefPage.html)。 – MagunRa

+0

這是一個圖形的鄰接矩陣。 我需要它來實現TSP算法 – AlmuHS

相關問題