Вставить элементы указателя в массив в std :: list в C ++ - PullRequest
0 голосов
/ 28 мая 2011

Полагаю, я мог бы просто использовать список, но на данный момент мне просто любопытно, почему не работает следующий код:

struct treeNode{  
    char symbol;  
    double freq;  
    int left;  
    int right;  
};

treeNode *tree;
int nOS = 16;
tree = (treeNode *)malloc(sizeof(treeNode) * nOS);
list<treeNode> treeList;

После инициализации всех элементов в дереве я пытаюсь переместить их в treeList и получить ошибку сегментации, это не происходит, если tree это treeNode tree [nOS], но я работаю с неизвестным количеством элементов, поэтому мне нужно возможность использовать realloc, следовательно, использовать malloc:

for (int i = 0; i < nOS; i++) {
    treeList.push_back(tree[i]);
}

Я пробовал приводить tree [i] к различным вещам: (treeNode), (const treeNode), но я не могу понять, как заставить его работать. Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Я сделал это в ideone, и, похоже, работает: (без ошибок)

#include<list>
#include<vector>
#include <stdlib.h>
#include<iostream>

struct treeNode{  
    char symbol;  
    double freq;  
    int left;  
    int right;  
};

int main(int argc, char** argv)
{
treeNode *tree;
int nOS = 16;
tree = (treeNode *)malloc(sizeof(treeNode) * nOS);
std::list<treeNode> treeList;

std::vector<treeNode> symbolList;

for (int i = 0; i < nOS; i++) {
    symbolList.push_back(tree[i]);
}

std::cout << symbolList.size();

};
1 голос
/ 28 мая 2011

Нет необходимости malloc структур, если вы только собираетесь поместить их в список по значению (вместо указателей). Код можно переписать примерно так:

struct treeNode {
    char symbol;
    double freq;
    int left;
    int right;
};

int main()
{
    const int nOS = 16;

    std::list<treeNode> treeList(nOS, treeNode());

    std::cout << treeList.size() << std::endl;

    return 0;
}

Хотя для дерева у вас обычно бывают указатели на левый / правый узлы, поэтому структура будет выглядеть примерно так:

struct treeNode {
    char symbol;
    double freq;
    struct treeNode *left;
    struct treeNode *right;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...