3

私はこのコードを持っています:

#include <iostream>
#include <vector>
#include <list>

using namespace std;

class Graph {
    public:
        //Create graph with n nodes
        Graph(int size);
             ~Graph();

        //Initialize graph
        void InitializeGraphWithRandomNum();


    private:

        vector <list <int*> > *graph;

};


void Graph::InitializeGraphWithRandomNum() {
    //Here I want to iterate
    for (int i=0; i< graph->size(); i++) {
        std::list <int*>::iterator it;
        for (it = graph[i].begin(); it< graph[i].end();++it) {
                 ..........
            }

    }
}

ここで何かが間違っています。それは言う

'it = (((Graph*)this)->Graph::graph + ((unsigned int)(((unsigned int)i) * 12u)))->std::vector の 'operator=' に一致しません<_Tp, _Alloc>::begin with _Tp = std::list, _Alloc = std::allocator >, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator*, std::vector > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = std::list*' DejkstraAlg.cpp

ありがとうベスト

4

4 に答える 4

4

graphベクトルではなく、ベクトルへのポインタです。ベクトルとして宣言するか、 を使用します(*graph)[i].begin()

于 2013-10-29T10:44:01.673 に答える
4

への変更

void Graph::InitializeGraphWithRandomNum()
{
    typedef list<int*> int_list;
    typedef vector<int_list> int_list_vector;

    for (int_list_vector::iterator vectit = graph->begin(); vectit != graph->end(); ++vectit)
    {
        for (int_list::iterator listit = vectit->begin(); listit != vectit->end(); ++listit)
        {
            int* value = *listit;
        }
    }
}

または、C++11 を使用している場合 (タグには含まれていませんが、他のユーザーにとっては役立つ可能性があります):

void Graph::InitializeGraphWithRandomNum()
{
    for (auto vectit = graph->begin(); vectit != graph->end(); ++vectit)
    {
        for (auto listit = vectit->begin(); listit != vectit->end(); ++listit)
        {
            int* value = *listit;
        }
    }
}

また、C++ 11 の非メンバーの begin/end に興味がある場合は、多くの C++-er (私のような) が次の支持者です。

void Graph::InitializeGraphWithRandomNum()
{
    for (auto vectit = begin(*graph); vectit != end(*graph); ++vectit)
    {
        for (auto listit = begin(*vectit); listit != end(*vectit); ++listit)
        {
            int* value = *listit;
        }
    }
}
于 2013-10-29T10:51:21.383 に答える
1

graphベクトルへのポインターであり、代わりにend()使用する反復子を比較するためにも使用されますoperator!=operator<

 for (it = (*graph)[i].begin(); it != (*graph)[i].end(); ++it)
 //                                ^^^

単に書くほうがいい:

vector <list<int>> graph;
于 2013-10-29T10:47:09.813 に答える
0

エラーは、リストの要素に値を割り当てようとしているステートメネット (表示されていません) を示しています。*int へのポインターの型があることを忘れていたと思います。だから代わりに

*it = value;

あなたは書く必要があります

**it = value;
于 2013-10-29T10:48:13.290 に答える