STL list for storing structure pointers

I have a structure called a vertex, and I created some pointers to them. I want to add these pointers to the list. My code below, when it tries to insert a pointer into a list, creates a segmentation error. Can someone explain what is happening?

#include <iostream>
#include <list>

#define NUM_VERTICES 8

using namespace std;

enum { WHITE, GRAY, BLACK };

struct vertex
{
    int color;
    int distance;
    char parent;
};

int main()
{
    //create the vertices
    vertex r = {WHITE, NULL, NULL};

    //create pointer to the vertex structures
    vertex *pr = &r;

    //create a list to hold the vertices
    list<vertex*> *r_list = new list<vertex*>;

    list<vertex*>::iterator it;

    r_list->insert(it, pr);
}
+3
source share
4 answers

There are a few things here.

First, you do not initialize the iterator, as others said:

list<vertex*>::iterator it = r_list->begin();

Do this and your code will be fine. But your code is performing poorly.

? : . delete r_list . (std::unique_ptr, std::shared_ptr, ++ 11, : boost::scoped_ptr boost::shared_ptr)

, :

//create a list to hold the vertices
list<vertex*> r_list;

list<vertex*>::iterator it = r_list->begin();

r_list.insert(it, pr);

, . push front() push back():

//create a list to hold the vertices
list<vertex*> r_list;

r_list.push_back(pr);

: , , - .

:

// global
list<vertex*> r_list;

void some_function(void)
{
    //create the vertices
    vertex r = {WHITE, NULL, NULL};

    //create pointer to the vertex structures
    vertex *pr = &r;

    r_list.push_back(pr);
} // right here, vertex r stops existing: the list now contains an
  // invalid pointer.

:

// global
list<vertex*> r_list;

void some_function(void)
{
    //create the vertices
    vertex *r = new vertex;
    r->color = WHITE;
    r->distance = 0;
    r->parent = 0;

    r_list.push_back(r);
}

. , , , lsit delete . Boost Pointer Container Library.

, , , ( ):

//create a list to hold the vertices
list<vertex> r_list;

//create the vertices
vertex r = {WHITE, NULL, NULL};

r_list.push_back(r);

, :

struct vertex
{
    int color;
    int distance;
    char parent;

    vertex(int _color, int _distance, char _parent) :
    color(_color),
    distance(_distance),
    parent(_parent)
    {
    }
};

//create a list to hold the vertices
list<vertex> r_list;

r_list.push_back(vertex(WHITE, NULL, NULL));

( )

-, NULL . distance parent , 0 NULL:

//create the vertices
vertex r = {WHITE, 0, 0};

-, constants, #define:

#define NUM_VERTICES 8 // <- bad
const int NumberVertices = 8; // <- good

, :

enum Color { WHITE, GRAY, BLACK };

, !

+10

, it . :

list<vertex*>::iterator it = r_list->begin();

, int char NULL? NULL .

, , , ints?

, , . , &r.

, , push_back()?

:


using namespace std;

enum Color { 
    WHITE, 
    GRAY, 
    BLACK 
};

struct vertex
{
    Color color;
    int distance;
    char parent;
};

int main(int argc, char** argv) {
    //create the vertices
    vertex r = {WHITE, 0, ''};

    //create a list to hold the vertices
    list* r_list = new list();

    list::iterator it = r_list->begin();
    r_list->insert(it, &r);

    // Or even better, use push_back (or front)
    r_list->push_back(&r);
}
+2

, . , r_list->push_back(pr), .

, , r . , , main(), , , , , ...

+2

it, / /.

std::list push_back push_front; insert, , .

+1

Source: https://habr.com/ru/post/1711896/


All Articles