【问题标题】:append matrix to stl matrix (2d std::vector)将矩阵附加到 stl 矩阵(2d std::vector)
【发布时间】:2018-07-22 13:11:11
【问题描述】:

这是将行(矩阵)附加到矩阵的方式吗?

#include <vector>
#include <memory>
using std::vector;

int size = 4; // width;
int chunk = 2; // high
int main(int argc, char const *argv[]) {
    vector<vector<int>> m(10, vector<int>(size));

    auto func = []() {
        vector<vector<int>> n(chunk, vector<int>(size));
        return n;
    };
    int j = 0;
    for(int i = 0; i < 5; i++) {
        auto n = func();
        for(auto &row : n) m[j++] = row; // append rows
    }
}

我希望可以只使用m.push_back(n)

【问题讨论】:

  • 是的,但逐行:m.push_back(n[0]); m.push_back(n[1]); ...
  • 总是逐行?没有单发?
  • 注释说“追加行”,但代码实际上用新行替换了现有行。整个循环是一个非常复杂的无操作 - m 最终处于与之前完全相同的状态。你又想达到什么目的?
  • 您显示的是,只需将所有内容从n 复制到m。如果这是您的意图,您为什么不简单地:m = std::move(func());?然后也避免了对m 的额外分配。
  • 好吧,我必须做 5 次,每次在 m 中加载(转移/移动)2 行。

标签: c++ c++11 stl c++14


【解决方案1】:

我认为您正在寻找的是:

m.insert(m.end(), n.begin(), n.end());

然而,这将复制n 的内容。如果您不再需要 n 之后,使用 move_iterator 适配器移动行会更有效:

m.insert(m.end(),
    std::make_move_iterator(n.begin()),
    std::make_move_iterator(n.end()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多