当为将被放入数组中的字符串列表动态分配内存时,是否可以在程序的稍后添加到该列表中
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?
我试图了解指针和数组如何在运行时动态扩展内存。我有这个程序来说明我在说什么。假设用户生成int input = 5
,并且在该程序运行其进程之后,sName
和sID
各持有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。顺便说一句,向量最适合这类问题,它们可以动态自动地增加/减少大小。
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 模板化检查是否存在带有参数列表的类成员函数?
- 移动后是否需要重置标准::列表?
- 测试迭代器是否位于列表中的最后一个
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何检查C ++ STL列表是否为回文?
- 是否可以将图像列表保存到文件中?
- 初始值设定项列表是否足够静态以允许实例化模板?
- 类成员函数参数列表是否可以依赖于模板参数?
- 可变参数列表是否以空值终止?
- 将宏名称传递给 X 宏列表是否合法
- boost::instrusive::list 带有自动取消链接钩子:我可以使用列表中的值来确定列表是否只有一个元素
- 如何知道std::列表是否已被修改
- 编写布尔表达式以判断列表是否在增加
- 成员初始化列表是否复制字符串C++
- 删除链接列表是否安全
- 在构造函数声明中编写模板类型的参数列表是否有效?
- 在c++中传递数组并检查列表是否为数组的一部分
- 如何查找一个列表是否是另一个列表的子集