当为将被放入数组中的字符串列表动态分配内存时,是否可以在程序的稍后添加到该列表中

When dynamically allocating memory for a list of strings that will be put in an array, is it possible to add on to that list later in the program?

本文关键字:列表 是否 程序 添加 内存 数组 动态分配 字符串      更新时间:2023-10-16

我试图了解指针和数组如何在运行时动态扩展内存。我有这个程序来说明我在说什么。假设用户生成int input = 5,并且在该程序运行其进程之后,sNamesID各持有5个用户指定的字符串。如果我想让用户在最初的5之后添加更多元素,我是否必须尝试创建n+5的新数组(其中n是用户想要添加的元素的新数量),然后将sName和sID的值复制到这些数组中,以及用户输入的值?或者,除了使用向量之外,还有更简单的方法吗?

#include <iostream>
#include <string>
using namespace std;
int main()
{
int input;
string *sName = NULL;
string *sID = NULL;
string temp, temp2;
cout << "How many names";
cin >> input;
sName = new string[input];
sID = new string[input];
for (int i = 0; i < input; i++)
{
    cout << "Enter name ";
    cin >> temp;
    cout << "enter id ";
    cin >> temp2;
    *(sName + i) = temp;
    *(sID + i) = temp2;
}

    return 0;
}

小的初始警告:您的代码正在泄漏内存。

也就是说,我真的不明白为什么你不想使用向量来实现这一点,因为这需要更多的工作才能实现,你可以分配一个新的连续内存数组,并将旧元素复制回来(警告:没有检查迭代器,下面的代码是非常不鼓励的,它是一个示例,用于说明目的

// I want 2 additional elements
std::string *sNameOld = sName;
std::string *sIDOld = sID;
sName = new std::string[input + 2];
sID = new std::string[input + 2];
std::copy_n(sNameOld, input, sName);
std::copy_n(sIDOld, input, sID);
delete[] sNameOld;
delete[] sIDOld;
for (int i = input; i < input+2; i++)
{
    std::cout << "Enter name ";
    std::cin >> temp;
    std::cout << "enter id ";
    std::cin >> temp2;
    *(sName + i) = temp;
    *(sID + i) = temp2;
}
for (int i = 0; i < input + 2; ++i) {
    std::cout << sName[i] << " " << sID[i] << std::endl;
}
delete[] sName;
delete[] sID;

我强烈建议使用std向量,因为它们是您正在执行的任务的主要选择,因为它们提供了基于堆的动态分配,并且通过调整大小来灵活地添加新元素

#include <iostream>
#include <string>
#include <vector>
int main()
{
    int input;
    std::vector<std::string> sName;
    std::vector<std::string> sID;
    std::string temp, temp2;
    std::cout << "How many names";
    std::cin >> input;
    for (int i = 0; i < input; i++)
    {
        std::cout << "Enter name ";
        std::cin >> temp;
        std::cout << "enter id ";
        std::cin >> temp2;
        sName.push_back(temp);
        sID.push_back(temp2);
    }
    return 0;
}

示例

上面的代码甚至没有泄漏内存。

没有确切的C++替代C的realloc,尽管您可能会制作出适合该任务的东西,例如使用placementnew。

参考:C++:调整动态分配数组大小的正确方法是什么?

只是为了理解您正在以正确的方式进行操作。当达到数组限制时,必须添加n。顺便说一句,向量最适合这类问题,它们可以动态自动地增加/减少大小。