【问题标题】:Print all combinations of a 3D vector打印 3D 矢量的所有组合
【发布时间】:2018-12-04 16:37:46
【问题描述】:

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

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

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

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 行的每个组合。换句话说,我需要的是以下输出:

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 代码中展示我的问题的最接近的代码)

#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

【问题讨论】:

  • 我建议你用元素 100*i + 10*j + k 填充数组,然后你可以简单地从预期的输出中读出你需要的循环
  • 我不明白你的建议@user463035818。你能再解释一下吗?
  • 问题是我不理解您的预期输出,只有当您知道元素如何存储在向量中时才有意义,例如,值为19 的元素在什么索引处?如果您使用我建议的值,则值为123 的元素是result[1][2][3]。现在,如果你用这些值写下预期的输出,你可以直接读取你需要的循环
  • ...或者设为result[1][2][3] = 234(你不能将0作为前导数字...)
  • @user463035818 我使用的数字是随机的。在我原来的问题中,它们可以是任何正整数值。我想要的输出是:得到i = 0 的第一行,然后是i = 1 的第一行,然后是i = 2 的第一行。此时我形成了一个k x k 矩阵。在此之后,我想制作一个不同的矩阵。对不起,我不是很清楚

标签: c++ vector combinations


【解决方案1】:

我会创建一个以全 0 开头的 rows_to_print 向量。然后一次循环,它将最后一个值增加 1。如果该值大于最后一个向量的大小,则将其重置为 0 并增加列表中的下一个值,等等......你完成了当rows_to_print 中的每个值都大于每个向量的大小时循环:

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

【讨论】:

  • 感谢您的回答。在打印 0 1 26 7 815 16 17 时,您的代码似乎处于无限循环中
  • @ihavenoidea 我忘了参考!查看我的最新编辑。您还可以使用我刚刚提供的链接看到它。
  • 这很可能是我的错,所以我深表歉意。你得到了问题的想法,但是在你的解决方案中,例如打印0 1 29 10 1112 13 14 不是一个有效的,因为两个向量9 10 1112 13 14 在同一个i 中。
  • @ihavenoidea 您是在谈论最终运行程序时的输出吗?还是ideone链接?如果是后者,我使用的向量集与您不同。我在 ideone 输出上打印出向量的值。如果是前者,我将需要查看您的代码和完整输出...
  • @ihavenoidea 让我们将您的矩阵定义为K x Ji x K(其中Ji是每个第i个第二个向量的大小)。然后我们需要打印J1 * J2 * J3 * ... * Jn 组,其中每个组都有K 行和K 列,或K*K 项。如果我们调用最大的JiJ,那么最坏的情况(所有Ji 都是最大值)我们将打印K*K*J 项目。因此,如果您正在测量打印的项目,您可以说这具有O(K*K*J) 的复杂性。任何算法的打印复杂度也是如此,因为您想要相同的输出。这能回答你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2016-09-02
相关资源
最近更新 更多