如何旋转矢量矢量

use*_*425 11 c++ vector

我正在寻找一种优雅的方法来使用STL算法优先旋转矢量矢量或提升样本数据看起来像这样

vector<vector<int> > vm;
vector<int> v;
v.push_back(1);
v.push_back(2);
vm.push_back(v);
v.clear();
v.push_back(3);
v.push_back(4);
vm.push_back(v);
v.clear();
v.push_back(5);
v.push_back(6);
vm.push_back(v);

1   2
3   4
5   6
Run Code Online (Sandbox Code Playgroud)

我想得到一个像这样的int矢量向量

1   3   5
2   4   6
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 9

我想最简单的解决方案就是编写一个transpose带有两个循环的简单函数:

std::vector<std::vector<int> > transpose(const std::vector<std::vector<int> > data) {
    // this assumes that all inner vectors have the same size and
    // allocates space for the complete result in advance
    std::vector<std::vector<int> > result(data[0].size(),
                                          std::vector<int>(data.size()));
    for (std::vector<int>::size_type i = 0; i < data[0].size(); i++) 
        for (std::vector<int>::size_type j = 0; j < data.size(); j++) {
            result[i][j] = data[j][i];
        }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

应该足够容易地优化返回值.我认为使用任何标准功能都不会更简单或更有效,但我可能错了.

另一种方法是将所有数据存储在一个单元中vector,然后i, j使用i*row_length + j或类似的方式计算元素的位置.这样,转置不涉及数据复制,而只是改变索引的计算.


YXD*_*YXD 7

看看Boost MultiArray.您可以创建数据的子视图.还有vnl_matrix,它有一个转置方法.