-5

私は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.
4

5 に答える 5

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>
于 2013-03-06T21:08:32.317 に答える
1

あなたは再宣言していますg、最初にそれはでint*あり、それからあなたはそれをにしvector<int>ます。それがどのようにしてコンパイラを通過したのかわかりません。

また、使用するのではなく、代わりに使用することをnodo(1,2)検討してmake_pairください。使用newも悪い習慣と見なされ、のような動的コンテナstd::vectorまたはのような静的コンテナのいずれかを使用する必要がありますstd::array

于 2013-03-06T21:08:23.097 に答える
0

pair含まれていないため、クラスではありません<utility>

<vector>またはを含めていません<iostream>

于 2013-03-06T21:08:44.547 に答える
0

あなたには2つの名前があり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));
于 2013-03-06T21:09:17.653 に答える
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は1つに2回使用します。私はあなたが何をしたいのかvectorわかりませんが、多分あなたはもっとこのようなものが欲しいvectorでしょvectorう:

 std::vector< std::vector<nodo> > g(x) ;

次に、これはより理にかなっています:

 g[0].push_back(nodo(2,5)) ;

aの最初の要素はnotvectorになります。01

于 2013-03-06T21:12:32.967 に答える