【问题标题】:Simple Address Book using dynamic array使用动态数组的简单地址簿
【发布时间】:2013-11-19 19:18:38
【问题描述】:

我正在从事与 C++ 中“与客户保持联系”相关的学校项目。 我已经完成了我的项目,使用 std::vector 来存储每个添加的人的联系信息。但现在我必须使用 DYNAMIC ARRAY 编写相同的东西。

有没有人有任何想法或示例代码如何声明能够根据用户添加的联系人数量来改变其维度的动态数组?

我需要以下内容: * 声明具有未定义人数且每个人有 6 个联系人的动态数组。 * 添加新联系人。 * 列出数组中的所有联系人。

我使用向量完成了我的项目,没有任何问题,但现在我迷路了。我研究了很多关于在 c++ 中使用动态数组的文章,但没有任何进展。我在整个互联网上搜索一段示例代码,它可以满足我的需要,但找不到任何东西。

【问题讨论】:

  • std::vector 是一个动态数组。
  • @Till 我认为他指的是旧的 C 风格指针 malloc-ed 数组。
  • @texasbruce 哇,现在我看到并完全理解了教学价值 - 虽然如果我是老师,我会用相反的方式来做......

标签: c++ arrays memory dynamic allocation


【解决方案1】:

虽然这与您的项目并不完全相同,但这是我几天前的项目,我们必须使用二维动态数组,使用“新建”和“删除”方法来处理名称字符串。请记住,任何时候使用“new”都需要“delete”,否则会出现内存泄漏。我希望这会有所帮助。

#include <iostream>

using namespace std;

#include <memory.h>
#include <string.h> 
#include "ReadString.h"
#include "sort.h"


void main ()
{
bool contMain=true;
const long numNames=20;
long nameAc=0;
char ** ppNames;
ppNames=new char* [numNames];
char test;

while(contMain && nameAc<numNames)
{
    ppNames[nameAc]=ReadString();
    test=ppNames[nameAc][0];
    if(test=='\0')
    {
        contMain=false;
    }
    nameAc++;   
}
cout<<"Your names unsorted are:"<<endl;
print(ppNames, nameAc);
ppNames=sort(ppNames, nameAc);
cout<<"Your names, sorted, are:"<<endl;
print(ppNames, nameAc);


// deallocation... this will delete pNames and pTemp from the ReadString function
// as well as ppNames in main because they are all using the same pointers.
for(int i=0; i<nameAc; i++)
{
    delete ppNames [i];
}
delete[] ppNames;
}

这里是 ReadString 函数。

#include <iostream>

#include <memory.h>
#include "ReadString.h"

using namespace std;


char * ReadString()
{
long aSize=10;
long numChars (0);
char * pNames;
char * pTemp;
char c;
pNames=new char [aSize+1];

while((c = cin.get()) != '\n')
{
    if(numChars >= aSize)
    {
        aSize += numChars;
        pTemp = new char[aSize + 1];
        memcpy(pTemp, pNames, numChars);
        delete[] pNames;
        pNames = pTemp;
        cout << "Array size increased to " << aSize << endl;
    }
    pNames[numChars++] = c;
}
pNames[numChars] = '\0'; //end of string
return pNames;

【讨论】:

    【解决方案2】:

    您可以轻松使用的一件事是链表。您的数据结构有一个指向下一个列表元素的指针。

    struct ListElement 
    {
        CustomerData cutomer;
        ListElement *next;
    }
    

    您可以使用这样的数据结构作为基础来添加用于添加删除、查找、打印全部等的基础设施。

    另一种方式是动态的:

    添加一项示例:

    1. malloc 内存可用于您已有的任意数量的项目 + 1

    2. 将数据从旧内存复制到新内存

    3. 在分配空间+1的位置添加新项目

    您将需要基础架构,用于在开始时添加、在结束时、在中间删除一个等。与此方案一起使用。更改后根据需要分配尽可能多的内存,复制旧数据,插入/删除一项。

    祝你的项目好运!

    【讨论】:

      【解决方案3】:

      我能做到的最好的就是建议文章的链接。听起来您的讲师希望您使用一组更原始的工具以“艰难的方式”编写相同的程序。由于 std::vector 本质上是一个动态数组,我不得不假设他希望您重写必须手动管理内存的项目。这里有一些起点。请记住,Google 是您的朋友!

      C++ FAQ Lite

      Dynamic Memory Cplusplus.com

      LMGTFY

      【讨论】:

        猜你喜欢
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        相关资源
        最近更新 更多