【问题标题】:no match for operator [ ] (std::vector)运算符 [ ] 不匹配(std::vector)
【发布时间】:2018-02-07 17:22:11
【问题描述】:

所以,我已经使用邻接表制作了一个图形,并且我正在尝试使用递归来搜索它。收到一条尴尬的错误消息,说“与运算符 [] 不匹配”。代码如下:

#include <iostream>
#include <vector>
using namespace std;


void search(vector <int> *v,int node)
{
    if (node==4)
    {
        cout<<"found 4";
        return;
    }

    vector <int> :: iterator it;
    if (!v[node].empty())
    {
        for (it=v[node].begin() ; it!=v[node].end() ; it++)
        {
            search(v,v[node][it]);
        }
    }
}

int main()
{
    vector <int> v[5];
    v[1].push_back(2);
    v[1].push_back(3);
    v[2].push_back(4);
    v[2].push_back(5);
    search (v,1);
}

【问题讨论】:

  • v 不是std::vector。这是一个指针。指针也恰好支持[index] 语法,但要正确执行,最好先取消对指针的引用。
  • 更改:vector &lt;int&gt; *v --> vector &lt;int&gt; &amp;v
  • 您将vector &lt;int&gt; * 作为指针参数传递,所以您必须将其引用为调用operator[]() 函数。
  • v[node][it]:这里的it是一个迭代器。它不是一个索引。你不能把它放在方括号内。
  • 它现在可以工作了。我已将其更改为 v[ node ] [*it ] 。谢谢。

标签: c++ c++11 vector stl


【解决方案1】:

变量it 是一个迭代器。

vector <int> :: iterator it;

这不能用于索引这样的数组:

search(v,v[node][it]); // Expecting an index not an iterator.

我认为你想要的是取消引用迭代器。

search(v, *it);

【讨论】:

    【解决方案2】:

    您必须检查节点是否超出范围。

    试试这个:

    #include <iostream>
    #include <vector>
    using namespace std;
    void search(vector<int> *v, int count, int node)
        {
           if (node == 4)
           {
            cout << "found 4";
           return;
        }
    
        if (node < count && !v[node].empty())
        {
            for (auto it = v[node].begin(); it != v[node].end(); it++)
            {
                search(v, count, *it);
            }
        }
    }
    
    int main()
    {
       vector<int> v[5];
       v[1].push_back(2);
       v[1].push_back(3);
       v[2].push_back(4);
       v[2].push_back(5);
    
       search(v, sizeof(v) / sizeof(v[0]), 1);
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      在您的代码中,v 是一个指向向量的指针(代表一个数组)。要访问下标运算符,您必须首先使用 v[first_index] 访问 C 样式数组。然后,您必须索引从第一个索引中获得的任何返回对象。但是,您甚至不应该对向量使用指针。如果要修改容器,则通过引用传递它。如果你想存储一个向量数组,那么我建议你只嵌套它们(虽然这可能不利于内存,所以你可以创建一个一维向量并计算索引)。

      【讨论】:

      • 这不是将数组作为参数传递的可能方法之一吗?链接:tutorialspoint.com/cplusplus/…
      • 是的,但这不是最好的方法,因为数组一有机会就衰减为指针并失去对其大小的了解。使用vector 是一个更好的主意。
      • 但是为什么我会收到一条错误消息?这有什么语法错误?
      • OP 有一个 C 风格的 array 向量。
      • @n.m.固定解释
      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2014-11-04
      相关资源
      最近更新 更多