我正在编写用于使用STL vector 类创建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
你能帮助我吗?
最佳答案
std::vector
是连续的,可调整大小的值数组。如果先前未与第x个元素一起对其进行初始化,则无法访问其第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[]
时它会自动创建默认元素(但是请注意, map 实际上是一棵树,并且operator[]
执行对数搜索而不是 vector 的常量访问):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";
关于c++ - 如何在STL vector 矩阵中插入元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724561/