我正在阅读此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>
。
思想?