C ++ 11中矢量的笛卡儿积?

时间:2015-03-01 05:02:12

标签: c++ algorithm vector tuples

我正在阅读此stackoverflow帖子TMP: how to generalize a Cartesian Product of Vectors?,我对模板的简单性非常感兴趣,并且它不需要移动或复制。但是,就我而言,我有一个类向量,它们具有执行交叉乘积的数组;所以我不能指定交叉(a,b,c),并且通过和交叉(b,c)然后与a交叉,提供嵌套集。

我如何执行相同的操作,但使用向量而不是先验地知道参数[即交叉(矢量)]?

更好的是......可以用堆栈而不是递归调用来完成吗?

这是我的班级设置:

#include<vector>
#include<memory>

class Item {
public:
    std::string name;
    std::string id;
};

class ItemList {
public:
    std::vector<Item> items;
};

int main() {

    std::vector<std::shared_ptr<ItemList>> lists;

    // Load some sample data
    for( size_t list_idx = 0; list_idx < 3; list_idx++ ) {
        auto list = std::make_shared<ItemList>();
        for( size_t item_idx = 0; item_idx < 5; item_idx++ ) {
            Item item;
            item.name = "List " + std::to_string(list_idx) + " - Item " + std::to_string(item_idx);
            item.id = item.name;
            list->items.push_back( item );
        }
        lists.push_back(list);
    };

    // Now, how to perform the cross product of the items???
    // cross( a, b, c ) is not the same as cross( a, cross( b, c ))
}

编辑:澄清我的输入和输出:

因此,如果我有一个3个列表的向量,其中以下内容存储在Item类的名称成员中。

   A1, A2, A3
   B1, B2
   C1, C2, C3, C4

我想回来

   { A1, B1, C1 }
   { A1, B1, C2 }
   { A1, B1, C3 }
   { A1, B1, C4 }
   { A1, B2, C1 }
   { A1, B2, C2 }
   { A1, B2, C3 }
   { A1, B2, C4 }
   { A2, B1, C1 }
   { A2, B1, C2 }
   { A2, B1, C3 }
   { A2, B1, C4 }
   { A2, B2, C1 }
   { A2, B2, C2 }
   { A2, B2, C3 }
   { A2, B2, C4 }
   { A3, B1, C1 }
   { A3, B1, C2 }
   { A3, B1, C3 }
   { A3, B1, C4 }
   { A3, B2, C1 }
   { A3, B2, C2 }
   { A3, B2, C3 }
   { A3, B2, C4 }

EDIT2:@Matt McNabb提供的链接是在正确的轨道上,但是我不能使用boost,所以我不知道如果没有它,如何适当地修改它。此外,由于我有一个vector<shared_ptr<vector<>>>而不是vector<vector<>>,因此会使这一点复杂化。虽然,我可以生成vector<vector>

思想?

0 个答案:

没有答案