【问题标题】:Push elements of pointer to array to a std::list in C++将指向数组的指针元素推送到 C++ 中的 std::list
【发布时间】:2011-05-28 10:20:44
【问题描述】:

我想我可以只使用一个列表,但此时我只是好奇为什么以下代码不起作用:

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 并出现分段错误,如果树是 treeNode 树[nOS],则不会发生,但我正在处理未知数量的元素,所以我需要能够使用 realloc,因此使用 malloc:

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

我尝试将 tree[i] 转换为不同数量的东西:(treeNode), (const treeNode) 但我不知道如何让它工作。谢谢!

【问题讨论】:

  • 为什么是 malloc?为什么不使用向量?还是另一个清单?什么是符号列表?
  • 好吧,一开始我就说我知道我可以使用列表,但是我很好奇为什么这不起作用,以加深我对malloc,列表,c/c++的理解等。
  • 好的,但是什么是 symbolList - 你是说 treeList 吗?
  • 这是一个错字,我正在尝试选择更合适的名称,已修复它。
  • treeNode typedefed 吗?它应该是 sizeof (struct treeNode) 和类似的替代品。

标签: c++ list pointers casting tree


【解决方案1】:

我已经在 ideone 中完成了this,它似乎可以工作:(没有段错误)

#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();

};

【讨论】:

  • 你是对的。它确实有效。我的程序中肯定有其他问题,但是在我第一次尝试推送它时确实发生了段错误。让我进一步调查。
【解决方案2】:

如果您只打算按值(而不是指针)将它们推入列表中,则无需 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;
};

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2012-11-24
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多