2010-03-08 145 views
2

類似的問題之前已經被問過,但我無法找到與我的問題完全匹配的問題。幾個向量的笛卡爾積

我有4個向量,其中每個都保存200-500個4位整數。每個矢量中元素的確切數量不盡相同,但我可以將其修復爲特定值。我需要在這4個向量中找到所有可能的元素組合。

如:

V1 [10,30] V2 [11,45] V3 [63,56] V4 [82,98]

所以我得到這樣的:

[10,11,63,82]; [30,11,63,82]; [10,45,63,82]; [10,45,56,82]等。

這個算法有一個共同的名稱,所以我可以在網上找到它的一些參考?否則,任何有關在C++中實現這一點的提示都會有所幫助。性能不是一個問題,因爲我只需要運行一次算法。 STL中是否有內置的東西?

+2

當心將有200和500之間^ 4^4的組合。 500^4爲625億,200^4超過10億。 – 2010-03-08 22:37:47

+3

等一下,如果你只有2,v1 = {1,1,2}和v2 = {1,2},你是否希望{1,2}在輸出中出現兩次?另外,你認爲{1,2}和{2,1}是相同的嗎? – 2010-03-08 22:39:51

+12

此操作的通用名稱是「笛卡爾產品」。 – 2010-03-08 22:40:38

回答

11

沒有太多的算法的...

for(vector<int>::const_iterator i1 = v1.begin(); i1 != v1.end(); ++i1) 
    for(vector<int>::const_iterator i2 = v2.begin(); i2 != v2.end(); ++i2) 
     for(vector<int>::const_iterator i3 = v3.begin(); i3 != v3.end(); ++i3) 
      for(vector<int>::const_iterator i4 = v4.begin(); i4 != v4.end(); ++i4) 
       cout << "[" << *i1 << "," << *i2 << "," << *i3 << "," << *i4 << "]" << endl; 
+0

+1這是做到這一點的合乎邏輯的方法。可能有更漂亮的方式來表示,但過程將是相同的。 – 2010-03-08 22:32:13

+8

這就像是你希望你有一個meta-for循環可以循環遍歷for循環。 – 2010-03-09 00:02:17

+0

+1謝謝,這當然是工作。我同意Poita關於meta loop的評論。 – 2010-03-09 16:59:28