如何将列添加到多维矢量(C ++)?

时间:2018-07-18 22:47:53

标签: c++ vector

这可能很容易,但是我找不到解决方案。我创建了这样的2D矢量:

vector<vector<int> > matrix;
vector<int> row;

for (int i = 0; i < x;i++) {
    row.push_back(i);
}
for (int i = 0; i < x; i++) {
    matrix.push_back(row);
}

我遇到的问题是,我现在想根据需要添加行和列,因为随着时间的推移,我可能会用完矩阵空间,但是我不知道该怎么做。这些行很容易,我只需将另一行.push_back返回到矩阵的底端...但是我不知道如何添加另一列。
很抱歉,如果这个问题超级愚蠢,但我还没有编程经验,并且在向2D向量添加列的特定问题上我找不到任何东西。

3 个答案:

答案 0 :(得分:2)

在代码中添加的想法是循环遍历矩阵中的每一行,并将新元素推入每个向量。所有这些元素加在一起就是一个新列。

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

int main() {

    // Initialize a 3x3 matrix
    vector<vector<int>> matrix;
    vector<int> row;
    int x = 3;

    for (int i = 0; i < x; i++) {
        row.push_back(i);
    }

    for (int i = 0; i < x; i++) {
        matrix.push_back(row);
    }

    // Add a column; the matrix is now 3x4
    int newElement = 3;

    for (auto &row : matrix) {
        row.push_back(newElement);
    }

    // Print the matrix
    for (auto &row : matrix) {
        for (auto &cell : row) {
            cout << cell << ' ';
        }

        cout << endl;
    }

    return 0;
}

您可能希望将此代码分成多个函数。

答案 1 :(得分:1)

vector >是实现矩阵的一种BAD方法。好吧-这可能不是一个糟糕的后端实现,但是它是一个糟糕的公共API。

我建议使用一些旨在支持Matrix的库。想到一些:

https://github.com/SophistSolutions/Stroika/blob/V2.1-Release/Library/Sources/Stroika/Foundation/Math/LinearAlgebra/Matrix.h
https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html
http://arma.sourceforge.net/docs.html#part_classes

或者自己编写并直接实现基本功能。

答案 2 :(得分:0)

这是一个简单的函数,它将在矩阵中的指定位置添加一列:

void add_column(std::vector<std::vector<int>>& matrix,
                const std::vector<int>& column, std::size_t position)
{
    if(matrix.size() < position || position < 0) return; // check for position correctness

    std::size_t index = 0;
    for(auto& row : matrix){
        row.insert(row.begin() + position, column[index++]);
    }
}

例如,给定一个矩阵:

std::vector<std::vector<int>> matrix;

并像这样初始化它:

std::vector<int> column;
for (int i = 0; i < 3; i++) {
    column.push_back(3);
}
for (int i = 0; i < 3; i++) {
    matrix.push_back(column);
}

您以{x {1}} s的3x3矩阵结尾。现在,在第一个和第二个之间添加一列:

3

并打印:

add_column(matrix, std::vector<int>({9, 9, 9}), 1);

您最终得到:

for (auto& row : matrix) {
    for (const auto x : row) {
        std::cout << x << ' ';
    }
    std::cout << std::endl;
}