如何将元素插入STL矢量矩阵中

How can I insert a element in a STL vector matrix?

本文关键字:STL 元素 插入      更新时间:2023-10-16

我正在编写使用stl vector class创建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-the元素。这将是不确定的行为。

因此,您应该事先创建整个矩阵:

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[]执行对数搜索而不是向量的constant访问):

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";

如注释中所述,您需要先初始化"矩阵"。您可以访问元素。但是请注意,您应该将内部向量插入而不是"矩阵"中。另外,begin()返回一个需要使用->加速的迭代器。如果您的"矩阵"适当初始化,您也可以将[]使用用于ACCE,这更可用。

#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)。