2016-11-21 122 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

相关问题