我是 C ++ 的新手,当我尝试编译这段代码时,我得到了错误,我不知道如何修复:
int main()
{
typedef pair<int,int> nodo;
int x;
cin >> x;
int *g;
g = new int[x];
vector <nodo> g;
g[1].push_back(nodo(2,5));
g[1].push_back(nodo(3,10));
g[3].push_back(nodo(2,12));
g[2].push_back(nodo(4,1));
g[4].push_back(nodo(3,2));
for (int i = 1; i <=4; ++i){
// cout << i << " -> ";
for (int j = 0; j<g[i].size(); ++j){
// cout << g[i][j].first << " c: " << g[i][j].second << " ";
}
// cout << endl;
}
dijkstra(1, x);
system("pause");
return 0;
}
我收到的错误是:
Error: Expression must have a class type.
答案 0 :(得分:4)
下面:
int *g;
g = new int[x];
vector <nodo> g; // ERROR: Redeclaration!
您首先声明g
属于int*
类型,然后您将其重新声明为vector<nodo>
类型。这是非法的。
此外,如果要省略标准命名空间中类型的using namespace std
限定,则需要使用std::
指令。我不建议你使用它。更好地明确指定std::
,或者更确切地说使用特定的using
声明。
例如:
typedef std::pair<int,int> nodo;
// ^^^^^
int x;
std::cin >> x;
// ^^^^^
int *g;
g = new int[x];
std::vector <nodo> g;
// ^^^^^
还要确保导入所有必要的标准标题:
Type | Header
--------------------------
std::vector -> <vector>
std::pair -> <utility>
std::cin -> <iostream>
答案 1 :(得分:1)
您正在重新声明g
,首先是int*
,然后您将其变为vector<int>
。我不确定如何通过编译器。
此外,不要使用nodo(1,2)
而是考虑使用make_pair
。使用new
也被视为不良做法,您应该使用std::vector
之类的动态容器或std::array
之类的静态容器。
答案 2 :(得分:0)
pair
不是一个类,因为您没有包含<utility>
您还没有加入<vector>
或<iostream>
。
答案 3 :(得分:0)
您有两件名为g
的东西:
int* g;
和
vector <nodo> g;
这甚至都不会编译。
看起来你想要一个向量数组,在这种情况下你需要像
这样的东西std::vector<std::vector<nodo> > g(x); // size x vector of vectors.
然后你可以做这种事情:
g[1].push_back(nodo(2,5));
g[1].push_back(nodo(3,10));
答案 4 :(得分:0)
所以这个版本编译,我认为这就是你的意思:
// Need to include these headers
#include <utility>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
typedef pair<int,int> nodo;
int x;
cin >> x;
//int *h;
//h = new int[x];
//specify size of vector
std::vector< std::vector<nodo> > g(x);
g[0].push_back(nodo(2,5));
g[1].push_back(nodo(3,10));
g[2].push_back(nodo(2,12));
g[3].push_back(nodo(4,1));
g[4].push_back(nodo(3,2));
for (int i = 0; i < g.size(); ++i){
std::cout << i << " -> ";
for (int j = 0; j<g[i].size(); ++j){
cout << g[i][j].first << " c: " << g[i][j].second << " ";
}
cout << endl;
}
//dijkstra(1, x);
//system("pause");
return 0;
}
很多问题,您只使用g
两次。我不确定你想对vector
做什么,但也许你想要vector
vector
更像这样:
std::vector< std::vector<nodo> > g(x) ;
然后这会更有意义:
g[0].push_back(nodo(2,5)) ;
vector
的第一个元素位于0
而不是1
。