2011-01-23 24 views
0
int test[5][5]; 
stack<int**> mystack; 
mystack.push(test); 

我得到的錯誤:將2d數組推到C++ STL堆棧上?

no matching function for call to ‘std::stack > >::push(int [5][5])’ /usr/include/c++/4.4/bits/stl_stack.h:182: note: candidates are: void std::stack<_Tp, _Sequence>::push(const typename _Sequence::value_type&) [with _Tp = int**, _Sequence = std::deque >]

我從來沒有真正使用堆棧之前,所以我希望得到任何幫助。如果我將測試聲明爲一維數組並且將其作爲int *進行堆棧,那麼它可以正常工作。

編輯:我試圖爲sudokusolver實施追溯。我把數獨網格作爲一個9x9的集合對象數組(對象持有解決方案或可能的解決方案)。我必須將拼圖的當前狀態推入堆棧,然後從那裏嘗試猜測並檢查。如果猜測產生矛盾(即違反數獨的規則),那麼我會在堆棧中彈出以在無效猜測之前恢復難題。

+0

如果'的boost :: array`或'的std :: array` C++ 0x中是允許的,你可以使用 `堆棧<陣列<陣列< int, 5 >,5>>爲您的目的。 – 2011-01-23 13:11:48

回答

1

int **與2D陣列不一樣。指向int test[5][5]的指針將是int (*)[5],因此您需要一個stack<int (*)[5]>。這裏有一個很好的解釋:Arrays and pointers in C

+0

我想推動整個數組,而不僅僅是一個指向它的指針。 – kevin 2011-01-23 02:46:26

+0

@kevin:你不能自己推一個數組,只有一個指向它的指針。大部分時間無關緊要,因爲您可以像使用數組本身一樣使用指針。 – casablanca 2011-01-23 02:48:33

2

在你的例子中,test而不是類型int**

如果你想要一個二維數組,我會推薦使用std::vector。這肯定會保存您的混淆數組和指針...

typedef std::vector<std::vector<int> > two_d_vector; 
two_d_vector test; 
stack<two_d_vector> mystack; 
mystack.push(test);