首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印3D矢量的所有组合

打印3D矢量的所有组合
EN

Stack Overflow用户
提问于 2018-12-05 00:37:46
回答 1查看 99关注 0票数 2

假设我有一个vector<vector<vector<int> > > result

我之前知道的唯一大小是内部和外部向量,它们的大小是k

如果我打印result,我会得到这个(对于k = 3):

代码语言:javascript
复制
i = 0

0 1 2
3 4 5

i = 1

6 7 8
9 10 11
12 13 14

i = 2

15 16 17
18 19 20

我需要做的是打印来自i的向量的每个向量的k行的每个组合。换句话说,我需要的是以下输出:

代码语言:javascript
复制
0 1 2
6 7 8
15 16 17

0 1 2
6 7 8
18 19 20

0 1 2
9 10 11
15 16 17

...

3 4 5
12 13 14
18 19 20

希望我已经清楚了所需的输出。我已经尝试了上千个不同的循环,试图保存到另一个vector<vector<int> >中,但到目前为止都没有成功。我真的很迷茫,任何帮助都会让我非常感激。

生成上述输出的代码如下:

(我很抱歉,我知道这是一个丑陋的代码,但这是我能用MCVE代码演示我的问题的最接近的代码)

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<vector<vector<int> > > result;
    int k = 3;
    vector<vector<int> > randomVectors;
    //I'll create seven random vectors
    //In my original problem, I don't have this number beforehand
    int number = 0;
    for(int i = 0; i < 7; i++){
        vector<int> temp;
        for(int j = 0; j < k; j++){
            temp.push_back(number);
            number++;
        }
        randomVectors.push_back(temp);
    }
    //Vector of vector to assign to "result"
    vector<vector<int> > randomVectors_0;
    randomVectors_0.push_back(randomVectors[0]);
    randomVectors_0.push_back(randomVectors[1]);
    vector<vector<int> > randomVectors_1;
    randomVectors_1.push_back(randomVectors[2]);
    randomVectors_1.push_back(randomVectors[3]);
    randomVectors_1.push_back(randomVectors[4]);
    vector<vector<int> > randomVectors_2;
    randomVectors_2.push_back(randomVectors[5]);
    randomVectors_2.push_back(randomVectors[6]);

    result.push_back(randomVectors_0);
    result.push_back(randomVectors_1);
    result.push_back(randomVectors_2);

    cout << "Printing the 3D vector" << endl;
    for(int i = 0; i < k; i++){
        cout << "i = " << i << endl << endl;
        for(int j = 0; j < result[i].size(); j++){
            for(int m = 0; m < k; m++){
                cout << result[i][j][m] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }
    return 0;
}

编译器版本: gcc (tdm-1) 4.7.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-05 00:58:39

我会创建一个全以0开头的rows_to_print向量,然后循环一次,最后一个值会递增1。如果这个值大于最后一个向量的大小,那么将其重置为0并递增列表中的下一个值,依此类推……当rows_to_print中的每个值都大于每个向量的大小时,您就完成了循环:

代码语言:javascript
复制
void print_rows(std::vector<size_t> rows, std::vector<std::vector<std::vector<int>>> v) {
    for(size_t x = 0; x < v.size(); x++) {
        for(size_t y = 0; y < v.at(x).at(rows.at(x)).size(); y++) {
            std::cout << v.at(x).at(rows.at(x)).at(y) << ' ';
        }
        std::cout << std::endl;
    }
}

bool increment_rows(std::vector<size_t> &rows, std::vector<std::vector<std::vector<int>>> v) {
    if(!rows.size()) return false; //empty rows, BAD
    rows.at(rows.size() - 1)++;
    for(int x = rows.size() - 1; x >= 0; x--) {
        if(rows.at(x) >= v.at(x).size()) {
            if(x <= 0) { return false; } //first row is done, then we're done!
            rows.at(x-1)++; //increment previous row and set us back to 0 (overflow)
            rows.at(x) %= v.at(x).size();
        }
    }
    return true;
}


int main() {
    ...

    std::vector<size_t> rows_to_print(k, 0);
    print_rows(rows_to_print, result);
    while(increment_rows(rows_to_print, result)) {
        print_rows(rows_to_print, result);
    }
}

在这里查看它的实际效果:ideone

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53617633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档