【问题标题】:Iterate over the lists in vector c++遍历向量 C++ 中的列表
【发布时间】:2013-11-08 11:14:18
【问题描述】:

我有这个代码:

#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 中的 'operator=' 不匹配::vector<_tp _alloc>:: 以 _Tp = std::list, _Alloc = std::allocator >, std::vector<_tp _alloc>::iterator = __gnu_cxx::__normal_iterator*, std::vector 开头>>, 类型名 std::_Vector_base<_tp _alloc>::_Tp_alloc_type::pointer = std::list*' DejkstraAlg.cpp

谢谢 最好的

【问题讨论】:

    标签: c++ list vector stl


    【解决方案1】:

    graph 是指向向量的指针,而不是向量。要么将其声明为向量,要么使用(*graph)[i].begin()

    【讨论】:

      【解决方案2】:

      改成

      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 非成员开始/结束,那么许多 C++ 人(比如我)都支持:

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

      【讨论】:

      • 对迭代器使用auto 也可以,而且可能更整洁。
      • 他的标签中没有提到 C++11,所以我省略了。将添加 alt 版本:)
      • 基于范围的 for 循环将使 C++11 部分更漂亮。
      【解决方案3】:

      graph 是一个指向向量的指针,也可以将迭代器与end() 进行比较,使用operator!= 而不是operator&lt;

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

      最好只写:

      vector <list<int>> graph;
      

      【讨论】:

        【解决方案4】:

        错误指向您试图为列表元素赋值的状态(您没有显示)。我想你忘记了*它有指向 int 的指针类型。 所以不是

        *it = value;
        

        你必须写

        **it = value;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 2019-07-19
          • 1970-01-01
          相关资源
          最近更新 更多