【问题标题】:Pushing a 2d array onto a C++ STL stack?将二维数组推入 C++ STL 堆栈?
【发布时间】:2011-01-23 02:21:40
【问题描述】:
int test[5][5];
stack<int**> mystack;
mystack.push(test);

我得到错误:

没有匹配的函数调用‘std::stack >::push(int [5][5])’ /usr/include/c++/4.4/bits/stl_stack.h:182:注意:候选者是:void std::stack<_tp _sequence>::push(const typename _Sequence::value_type&) [with _Tp = int** , _Sequence = std::deque >]

我以前从未真正使用过堆栈,因此我将不胜感激。如果我将 test 声明为一维数组并将堆栈声明为 int*,则它可以正常工作。

编辑:我正在尝试为数独求解器实现回溯。我将数独网格作为一个 9x9 的集合对象数组(包含解决方案或可能解决方案的对象)。我必须将拼图的当前状态推入堆栈,然后从那里尝试猜测和检查。如果猜测产生矛盾(即违反数独规则),那么我会从堆栈中弹出以恢复在无效猜测之前的谜题。

【问题讨论】:

  • 如果 C++0x 中的 boost::arraystd::array 是允许的,你可以使用 stack&lt; array&lt; array&lt; int, 5 &gt;, 5 &gt; &gt; 来达到你的目的。

标签: c++ multidimensional-array stack 2d


【解决方案1】:

int ** 与二维数组不同。指向int test[5][5] 的指针是int (*)[5],所以你需要一个stack&lt;int (*)[5]&gt;。这里有一个很好的解释:Arrays and pointers in C

【讨论】:

  • @kevin:你不能推送一个数组本身,只能推送一个指向它的指针。大多数时候都没有关系,因为您可以像使用数组本身一样使用指针。
  • @etarion:OP 现在才添加了这个要求,但事实仍然是你不能直接推送数组。在这种情况下,@Johnsyweb 使用向量的解决方案会更好。
【解决方案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);

【讨论】:

  • 刚刚对我的原始帖子进行了编辑,我需要先进后出。
  • 堆栈通常被描述为后进先出,但是,是的,push 的第一个元素应该是pop 的最后一个元素。
猜你喜欢
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多