我正在尝试创建一个图形,其中每个节点都是一对两个int
值。为此,我创建了一个 pii (pair<int, int>)
类型的列表adj
。现在,当我尝试在列表中push_back
pii类型节点时,它说
error: no match for 'operator[]' (operand types are 'std::list<std::pair<int, int> >*' and 'std::pair<int, int>')|
这是我的代码。(我还没有添加main()
的边缘)。我已经包含了所有必要的标题。我已经搜索过,但找不到类似的错误。
#define pii pair<int, int>
#define lli long long int
using namespace std;
class graph
{
lli v;
list<pii> *adj;
public:
graph(lli v);
void addEdge(pii n, pii m);
void bfs(pii s);
};
graph::graph(lli v)
{
this->v = v;
adj = new list<pii >[v];
}
void graph::addEdge(pii n, pii m)
{
adj[n].push_back(m); //Error Line
}
void graph::bfs(pii s)
{
bool visited[v];
memset(visited, false, sizeof(visited));
list<pii> q;
list<pii>::iterator it;
q.push_back(s);
while(!q.empty())
{
pii temp = q.front();
q.pop_front();
for(it = adj[temp].begin() ; it != adj[temp].end() ; it++)
{
if(!visited[*it])
{
visited[*it] = true;
q.push_back(*it);
}
}
}
}
int main()
{
int n, m, i, j;
pii coordinates;
cin>>n>>m;
char input[n][m];
for(i = 0 ; i < n ; i++)
{
for(j = 0 ; j < m ; j++)
{
cin>>input[i];
make_pair(i, j);
}
}
graph(n*m);
return 0;
}
adj
的类型是std::list<std::pair<int, int>>*
,这是一个指针。指针实现以下operator[]
T & operator[](T *, std::ptrdiff_t);
您正在尝试调用以下内容:
T& operator(T*, std::pair<int, int>);
您需要使用有符号整数的 std::ptrdiff_t
类型调用 operator[]
。
void graph::addEdge(***int*** n, pii m)
{
adj[n].push_back(m); //Error Line
}
正如其他人所说,对你的问题的直接回答是你试图用pii
索引指针(你#defined
为pair<int,int>
),并且由于pii
没有自动转换为整数,所以它不能用作索引。
从更广泛的角度来看,由于您的缩写变量和方法名称,很难看出您要做什么。您的意图是adj
成为列表数组吗?如果是这样,你只需要将第一个参数更改为 addEdge to int
,以便它可以用作此数组的索引。但是从快速浏览方法bfs
来看,看起来adj
可能只是一个列表,在这种情况下,您可以从其声明中删除星号并消除其在图形构造函数中的赋值,并完全消除索引。或者,如果您要做的是将一个pii
映射到另一个pii
,则需要使用类似std::map
而不是std::list
。