none
请教关于iterator的使用 map<int, list<Type>> RRS feed

  • 问题

  • 请帮忙看下下面这段程序  是关于无向图的 其中EdgeType是自定义的struct

    在class Graph中 定义了 private成员  map<int, list<EdgeType>> adjMap;
    其中 int 表示顶点编号, list为邻接表, 以下为插入边的程序, 编译无误,其中就用到了list iterator

    void Graph::insertEdge(int v1, int v2, double w)
    {
        bool status = false;
        while (!status)
        {
            if (v1==-1 || v2==-1)
            {
               cout << "the end node (" << vertexNames[v1] << " or "
                    << vertexNames[v2] << ") of the input link does not exist." << endl;
               status = true;
               break;
            }
            for (list<EdgeType>::iterator iter= adjMap[v1].begin();   // 这里编译无误
                 iter != adjMap[v1].end(); iter++)
            {
                if (iter->adjvex == v2)
                {
                    cout << "The link <"<< vertexNames[v1] << "," << vertexNames[v2] <<"> has already exist." << endl;
                    status = true;
                    break;
                }
                else
                    cout << "the neighbour of " << vertexNames[v1] << " is " << vertexNames[iter->adjvex] << ";   ";
            }
            cout << endl;
            countEdges++;
            adjMap[v1].push_back(EdgeType(v2, w, countEdges));
            if (!directed)
                adjMap[v2].push_back(EdgeType(v1, w, countEdges));
            status = true;
        }
    }

    但是当其他成员function中也需要使用
    类似循环的时候
    for (list<EdgeType>::iterator iter = adjMap[u].begin().....
    编译出错:

    error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)

    我已经走投无路了。。。大家帮忙看看

    到底是哪里错了? 
    2010年3月13日 3:11

答案

  •  map<int, list<EdgeType>>::const_iterator it = adjMap.find(v1);

     for (list<EdgeType>::const_iterator iter= it->second.begin();   // 这里编译无误
                 iter != it->second.end(); iter++)
            {
    ...
    }
    麻烦把正确答案设为解答。
    2010年3月16日 14:43
    版主

全部回复

  • 这可能是因为adjMap为const的原因。[]操作符好像不是const的。
    举例:
    class A
    {
    public:
         int operator[](int i)
         {
                ...
         }
    };

    int main()
    {
         const A a;

         cout<<a[2]<<endl; //由于operator[]不是const,所以,const 修饰的a是不能这么用的。就会出现以上编译错误。
    }
    LHL
    2010年3月14日 10:18
  •  map<int, list<EdgeType>>::const_iterator it = adjMap.find(v1);

     for (list<EdgeType>::const_iterator iter= it->second.begin();   // 这里编译无误
                 iter != it->second.end(); iter++)
            {
    ...
    }
    麻烦把正确答案设为解答。
    2010年3月16日 14:43
    版主