Как вставить список указателей в список указателей? - PullRequest
1 голос
/ 08 января 2020

Допустим, у меня есть эти два списка с указателями.

list<Node **> open;
list<Node *> new_children;

Я бы хотел заполнить list<Node **> open указателями, которые указывают на элементы list<Node *> new_children:

for (Node * n : new_children)
{
    open.emplace_front(&n);
}

После этого, если я запишу элементы open:

for (auto o : open)
{
    (**o).dump();
}

Я получаю один и тот же элемент снова и снова. Почему это?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Я думаю, что решил это. Когда я перебираю new_children, каждый Node * n является копией, что не повезло в случае указателей. Таким образом, правильный путь состоит в том, чтобы выполнять итерацию по ссылке и создавать Node ** указатели на основе адресов памяти. В моем случае другая проблема заключалась в том, что я создал Node ** в функции, поэтому, когда я покинул локальную область видимости, у меня появились висячие указатели. Для этого необходимо создать новый Node ** с new. emplace_front() на самом деле работает нормально.

for (auto & n : new_children)
{
    Node ** new_open = new Node *(n);
    open.emplace_front(new_open);
}
0 голосов
/ 08 января 2020

Этот фрагмент кода неправильный:

for (Node * n : new_children)
{
    open.emplace_front(&n);
}

Вам нужно использовать push_front:

for (Node * n : new_children)
{
    open.push_front(&n);
}

Чтобы делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...