好的,所以我寫了一個類似於stl的算法,稱爲cartesian_product
。對於那些不知道的人來說,笛卡爾積是兩組中每對可能的元素。所以{1, 2, 3}
和{10, 20, 30}
笛卡爾乘積是幫助使用C++模板模板
{(1,10), (1,20), (1,30), (2,10), (2,20), (2,30), (3,10), (3,20), (3,30)}
所以函數看起來像
template <typename InIt1, typename InIt2, typename OutIt>
void
cartesian_product(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt out)
{
for (; first1 != last1; ++first1)
for (InIt2 it = first2; it != last2; ++it)
*out++ = std::make_pair(*first1, *it);
}
有沒有模板類型定義,所以我做了一個traits類來保存類型 的輸出迭代器是:
template <typename ObjA, typename ObjB, template <typename> class Container>
struct cartesian_product_traits
{
typedef Container<std::pair<ObjA, ObjB> > type;
};
那麼我可以說:
typedef cartesian_product_traits<int, int, std::vector>::type IntPairList;
IntPairList my_list;
cartesian_product(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(my_list);
但這似乎並沒有編譯。我得到一個不錯的錯誤:
error C3201: the template parameter list for class template 'std::vector' does not match the template parameter list for template parameter 'Container'
所以我很難過。我如何得到這個工作?
+1投票僅僅表示「&c」代表「等」。 – rlbond 2009-06-11 05:33:00