遍历矢量 c++ 中的列表

Iterate over the lists in vector c++

本文关键字:列表 c++ 遍历      更新时间:2023-10-16

我有这个代码:

#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<_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::p ointer = std::list*' DejkstraAlg.cpp

谢谢最好

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

更改为

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;
        }
    }
}

graph 是一个指向向量的指针,也是为了比较迭代器end()使用 operator!= 而不是 operator<

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

最好只写:

vector <list<int>> graph;

错误指向 statemenet(您没有显示),您正在尝试为列表中的元素分配值。我想你忘记了*它有指向int的指针类型。所以而不是

*it = value;

你必须写

**it = value;