用c ++制作一个池概念

时间:2012-08-23 19:06:00

标签: c++ linked-list heap dynamic-allocation

我的结构为

struct Employee 
{ 
 char   uName  [255]; 
 struct   Employee *  next; 
 struct   Employee *  prev; 
};

所有我想一次分配100个结构对象的内存然后逐个使用它我做一个链表。如果内存被完全消耗,那么我想再分配100个对象内存

我正在进行分配

struct Employee * chunk=new struct Employee[100];

现在,当我想将新节点添加到链表时,我想从已经分配的内存中获取对象。有人可以告诉你如何实现这个目标

Employee * pEmployeeData=NULL;
for(long int i=1;i<=100;i++)
{
        pEmployeeData=EmployeePool+i;
        pEmployeeData->next=NULL;
        pEmployeeData->prev=NULL;
        InsertAtEnd(pEmployeeData);
}

其中InsertAtEnd在链表的末尾插入节点。请告诉如何实现此目的

2 个答案:

答案 0 :(得分:2)

我强烈建议您不要尝试通过编写自己的链表重新发明轮子,而是查看C ++标准库,其中包含可供您使用的现成容器类型。 (例如std::vectorstd::list)。

容器类型存在于C ++标准库中,用于存储数据/对象的集合。例如,你可以按照

的方式做点什么
#include <iostream>
#include <vector>
#include <string>

struct Employee
{
    std::string name;
    int id;
};

int main()
{
    std::vector<Employee> my_employees;

    Employee fred = { "Fred", 1 };
    Employee bob = { "Bob", 2 };

    my_employees.push_back( fred );
    my_employees.push_back( bob );


    std::cout << my_employees[0].id << " " << my_employees[0].name << "\n"
              << my_employees[1].id << " " << my_employees[1].name << std::endl;
}

标准容器易于使用和学习(您将找到大量描述如何使用它们的互联网资源 - 您的书也应该告诉您!);如果您是C ++的新手,那么最好在尝试创建自己的C ++之前先弄清楚如何使用它们。

答案 1 :(得分:0)

您可以覆盖您班级的newdelete运算符。

new必须查看任何现有池并查看是否有任何可用对象,如果没有,则需要分配池。然后,它将返回从它分配的内存。

delete需要检查已分配所提供对象的池。如果仍然在其中分配了任何对象,则池保持不变,否则可以删除它。

另外,既然您正在使用C ++,请考虑使用完整的类(尽管差别很小)