c++ - 如何得到几个子 vector 的组合?

标签 c++ c++11

我需要几个子 vector 的组合。我尝试用两个 for 循环来完成它,但我认为我需要递归。主要问题是我正在处理 vector 的 vector ,因此互联网上的大多数答案都不适用于我的情况。

我有一个带有多个子 vector 的 vector ,类似这样的东西:

std::vector<std::vector<std::vector<int>>> x = {{{0,0},{1,1}},{{2,2},{3,3}},{{4,4},{5,5}}}

我期望的输出是一个包含所有可能组合的 vector ,如下所示:

{{{0,0},{2,2},{4,4}},{{0,0},{2,2},{5,5}},{{0,0},{3,3},{4,4}},{{0,0},{3,3},{5,5}},...}

下面是上面例子中我需要的所有输出: {{0,0},{2,2},{4,4}} {{0,0},{2,2},{5,5}} {{0,0},{3,3} ,{4,4}} {{0,0},{3,3},{5,5}} {{1,1},{2,2},{4,4}} {{1,1},{2,2},{5,5}} {{1,1},{3,3} ,{4,4}} {{1,1},{3,3},{5,5}}

如果我的 vector 的大小是 3,我的子 vector 的大小也是 3,如下所示:{{{0,0},{1,1},{2,2}},{{ 3,3},{4,4},{5,5}},{{6,6},{7,7},{8,8}}}

输出必须是:

{{0,0},{3,3},{6,6}} , {{0,0},{3,3},{7,7}} , {{0,0},{3,3},{8,8}} ,  {{0,0},{4,4},{6,6}} , {{0,0},{4,4},{7,7}} , {{0,0},{4,4},{8,8}} ...

我的 vector/子 vector 的任何大小都是如此

最佳答案

创建以 {0, 0, 0, ...} 开头的索引 vector vi。在一个循环中,您将元素 x[i][vi[i]] 推回一个临时 vector 并递增 vi

您在循环中从后面递增 vi:如果 vi[i] 大于 x[i].size()你递增 vi[i - 1] ...

如果 vi 无法递增,则循环中断。

#include <iostream>
#include <vector>
using std::cout;
using std::ostream;
using std::size_t;
using std::vector;

ostream &operator<<(ostream &os, const vector<vector<vector<int>>> &vvec);
vector<vector<vector<int>>> combinations(const vector<vector<vector<int>>> &vvec);

int main() {
    vector<vector<vector<int>>> x = {{{0,0},{1,1}},{{2,2},{3,3}},{{4,4},{5,5}}};
    cout << combinations(x);
}

ostream &operator<<(ostream &os, const vector<vector<vector<int>>> &vvec) {
    bool first1 = true;
    for (const auto &v : vvec) {
        if (first1) first1 = false;
        else os << ' ';
        bool first2 = true;
        os << '{';
        for (const auto &el : v) {
            if (first2) first2 = false;
            else os << ',';
            os << '{' << el[0] << ',' << el[1] << '}';
        }
        os << '}';
    }
    return os;
}

vector<vector<vector<int>>> combinations(const vector<vector<vector<int>>> &x) {
    vector<size_t> vectorOfIndexes(x.size());
    vector<vector<vector<int>>> resultVector;
    bool finished = false;
    while (!finished) {
        vector<std::vector<int>> combination;
        for (size_t i{0}; i < vectorOfIndexes.size(); ++i) {
            combination.push_back(x[i][vectorOfIndexes[i]]);
        }
        resultVector.push_back(combination);
        for (size_t i {0}; i < vectorOfIndexes.size(); ++i) {
            ++vectorOfIndexes[vectorOfIndexes.size() - i - 1];
            if (vectorOfIndexes[vectorOfIndexes.size() - i - 1] >= x[x.size() - i - 1].size()) {
                vectorOfIndexes[vectorOfIndexes.size() - i - 1] = 0;
                if (i == vectorOfIndexes.size() - 1) finished = true;
            } else {
                break;
            }
        }
    }
    return resultVector;
}

输入:

{{{0,0},{1,1}},{{2,2},{3,3}},{{4,4},{5,5}}}

输出:

{{0,0},{2,2},{4,4}} {{0,0},{2,2},{5,5}} {{0,0},{3,3},{4,4}} {{0,0},{3,3},{5,5}} {{1,1},{2,2},{4,4}} {{1,1},{2,2},{5,5}} {{1,1},{3,3},{4,4}} {{1,1},{3,3},{5,5}}

输入:

{{{0,0},{1,1},{2,2}},{{3,3},{4,4},{5,5}},{{6,6},{7,7},{8,8}},{{9,9},{10,10},{11,11}}}

输出:

{{0,0},{3,3},{6,6},{9,9}} {{0,0},{3,3},{6,6},{10,10}} {{0,0},{3,3},{6,6},{11,11}} {{0,0},{3,3},{7,7},{9,9}} {{0,0},{3,3},{7,7},{10,10}} {{0,0},{3,3},{7,7},{11,11}} {{0,0},{3,3},{8,8},{9,9}} {{0,0},{3,3},{8,8},{10,10}} {{0,0},{3,3},{8,8},{11,11}} {{0,0},{4,4},{6,6},{9,9}} {{0,0},{4,4},{6,6},{10,10}} {{0,0},{4,4},{6,6},{11,11}} {{0,0},{4,4},{7,7},{9,9}} {{0,0},{4,4},{7,7},{10,10}} {{0,0},{4,4},{7,7},{11,11}} {{0,0},{4,4},{8,8},{9,9}} {{0,0},{4,4},{8,8},{10,10}} {{0,0},{4,4},{8,8},{11,11}} {{0,0},{5,5},{6,6},{9,9}} {{0,0},{5,5},{6,6},{10,10}} {{0,0},{5,5},{6,6},{11,11}} {{0,0},{5,5},{7,7},{9,9}} {{0,0},{5,5},{7,7},{10,10}} {{0,0},{5,5},{7,7},{11,11}} {{0,0},{5,5},{8,8},{9,9}} {{0,0},{5,5},{8,8},{10,10}} {{0,0},{5,5},{8,8},{11,11}} {{1,1},{3,3},{6,6},{9,9}} {{1,1},{3,3},{6,6},{10,10}} {{1,1},{3,3},{6,6},{11,11}} {{1,1},{3,3},{7,7},{9,9}} {{1,1},{3,3},{7,7},{10,10}} {{1,1},{3,3},{7,7},{11,11}} {{1,1},{3,3},{8,8},{9,9}} {{1,1},{3,3},{8,8},{10,10}} {{1,1},{3,3},{8,8},{11,11}} {{1,1},{4,4},{6,6},{9,9}} {{1,1},{4,4},{6,6},{10,10}} {{1,1},{4,4},{6,6},{11,11}} {{1,1},{4,4},{7,7},{9,9}} {{1,1},{4,4},{7,7},{10,10}} {{1,1},{4,4},{7,7},{11,11}} {{1,1},{4,4},{8,8},{9,9}} {{1,1},{4,4},{8,8},{10,10}} {{1,1},{4,4},{8,8},{11,11}} {{1,1},{5,5},{6,6},{9,9}} {{1,1},{5,5},{6,6},{10,10}} {{1,1},{5,5},{6,6},{11,11}} {{1,1},{5,5},{7,7},{9,9}} {{1,1},{5,5},{7,7},{10,10}} {{1,1},{5,5},{7,7},{11,11}} {{1,1},{5,5},{8,8},{9,9}} {{1,1},{5,5},{8,8},{10,10}} {{1,1},{5,5},{8,8},{11,11}} {{2,2},{3,3},{6,6},{9,9}} {{2,2},{3,3},{6,6},{10,10}} {{2,2},{3,3},{6,6},{11,11}} {{2,2},{3,3},{7,7},{9,9}} {{2,2},{3,3},{7,7},{10,10}} {{2,2},{3,3},{7,7},{11,11}} {{2,2},{3,3},{8,8},{9,9}} {{2,2},{3,3},{8,8},{10,10}} {{2,2},{3,3},{8,8},{11,11}} {{2,2},{4,4},{6,6},{9,9}} {{2,2},{4,4},{6,6},{10,10}} {{2,2},{4,4},{6,6},{11,11}} {{2,2},{4,4},{7,7},{9,9}} {{2,2},{4,4},{7,7},{10,10}} {{2,2},{4,4},{7,7},{11,11}} {{2,2},{4,4},{8,8},{9,9}} {{2,2},{4,4},{8,8},{10,10}} {{2,2},{4,4},{8,8},{11,11}} {{2,2},{5,5},{6,6},{9,9}} {{2,2},{5,5},{6,6},{10,10}} {{2,2},{5,5},{6,6},{11,11}} {{2,2},{5,5},{7,7},{9,9}} {{2,2},{5,5},{7,7},{10,10}} {{2,2},{5,5},{7,7},{11,11}} {{2,2},{5,5},{8,8},{9,9}} {{2,2},{5,5},{8,8},{10,10}} {{2,2},{5,5},{8,8},{11,11}}

关于c++ - 如何得到几个子 vector 的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775053/

相关文章:

c++ - delete命令会清除new分配的内存吗?

c++ - RAII 套接字 : when to release (close)

c++ - 在 switch 语句中从 int 到 enum 类的隐式转换

c++ - MongoDB C++ 驱动程序 3.0 以字符串形式获取文档并避免使用 json

c++ - 捕获此的 lambda 的访问权限

c++ - 设置 eclipse 链接器以编译和运行 GLFW 应用程序 - 如何?

c++ - 使用 QFile::readAll 函数时如何避免读取 "\n"

c++ - 为什么不能 p = itv?(来自 C++ 的 vector 问题)

c++ - 为什么 std::shuffle 采用右值引用?

c++ - 基本说明符中的全局限定