【问题标题】:implementing BFS using STL in c++在 C++ 中使用 STL 实现 BFS
【发布时间】:2014-08-26 12:13:26
【问题描述】:

我正在尝试使用 STL 在 C++ 中为 BFS 编写代码。这是我遇到问题的代码部分

std::list<int> li=*i;
for (std::list<int>::iterator iter=li.begin(); iter!=li.end();++iter)
{
  if (arr[iter]==0)
  {
    myQ.push(iter);
    arr[iter]=1;

这里的 arr 是存储我是否看到节点的数组。我得到了错误 "arr[iter] 中的运算符 arr[] 不匹配

【问题讨论】:

  • arr的定义是什么?
  • 问题是关于arr,但是你没有发布arr的定义是什么。
  • iter 是一个迭代器,所以是一种指针,而不是整数。这会在你的 arr[] 中造成麻烦,除非它被定义为一个地图。
  • std::list&lt;int&gt; li=*i; 这会复制整个列表。

标签: c++ arrays stl iterator


【解决方案1】:

iter 是一个迭代器,所以是一种指针,而不是整数。这是为什么 arr[] 不起作用,因为它需要一个整数。

尝试改用arr[*iter],您的广度优先搜索将成功避免循环。

请注意,如果 myQ 也应该包含节点,那么您的 push(iter) 也存在同样的潜在问题。

您可以通过将 arr 定义为集合而不是数组/向量来进一步改进您的设计。 您的情况将如下所示:

if (arr.count(*iter) == 0)  {
    myQ.push_back(*iter);
    arr.insert(*iter);  // works for int, but also other data types
}

【讨论】:

    【解决方案2】:

    我通过假设 arr 在一个整数数组中来回答。 任何数组元素只能通过其整数索引访问,而不是整数索引的地址。 这里的iter是可以存储整数地址的指针。

    所以你必须使用'*'来检索存储在地址中的值以获得整数值。

    所以将array[iter] 改为array[*iter]..

    希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      这里的 iter 是一个迭代器,它是指向列表的指针,所以要访问它的值,你必须写 *iter(访问它指向的值) 而不是 iter(它是引用)。

      试试这个

      std::list<int> li=*i;
      for (std::list<int>::iterator iter=li.begin(); iter!=li.end();++iter)
      {
          if (arr[*iter]==0)
          {
             myQ.push(*iter);
             arr[*iter]=1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        相关资源
        最近更新 更多