c++ - 如何在STL vector 矩阵中插入元素?

标签 c++ matrix vector stl

我正在编写用于使用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/

相关文章:

r - 加入两个邻接矩阵并保留值

python - 有没有更简单的方法在 Matlab 中构造 Mandelbrot 集?

c++ - 查找通过引用传递的容器的尺寸

C++ 指向类方法的指针

c++ - 修复已添加构造函数的结构的初始化

c++ - double vector 的 Python swig-wrapped vector 显示为元组

algorithm - 是否有仅基于少量起始值的数据填充二维矩阵的算法?

algorithm - 根据角度计算加速度

r - 更改向量中特定值的位置

c++ - 在 CentOS 和 Win7 上使用 QCryptographicHash 不匹配 MD5 哈希