在C++中创建数组
Creating Arrays in C++
嗨,我刚开始学习C++,我有一个快速的问题。
如果我正在创建一个包含5个结构的数组,我应该在构建时清除如下所示的数组,还是在声明时保留它。
换句话说就是做一些类似的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
和做类似的事情一样,请注意,我稍后基本上会循环这些并设置这些值。
person[5];
不,你没有。您需要的是person
的正确默认构造函数
只需为person
编写一个默认构造函数,假设它是struct
或class
。它将被调用以自动初始化每个数组元素。
一般来说,您可能更喜欢使用std::vector<person>
,但您还没有给出足够的上下文来确定。
默认构造函数看起来像这样:这个(注意std::string
有自己的默认构造函数,所以我们不需要为此做任何事情(
struct person {
std::string name;
int value;
person() : value(0) {}
};
现在这个:
person a[5];
无需进一步努力即可正确初始化。
如果你打算稍后"正确"初始化元素,那么使用向量可以更容易地跳过浪费的虚拟初始化:
struct person {
std::string name;
int value;
person() : value(0) {}
person(std::string const &n, int v) : name(n), value(v) {}
};
std::vector<person> people;
people.reserve(5);
// just create each person with the right values in the first place:
for (int i = 0; i < 5; ++i) {
people.push_back(person(get_name(i), get_value(i)));
}
最后,如果您不介意有未初始化的内存,那么您的第一个版本(没有构造函数和循环(就可以了。但是,请注意,无法跟踪哪些元素/成员是有效的,哪些是垃圾,这是错误的丰富来源。
只有具有静态存储持续时间的POD类型在创建时被零初始化。但是,由于使用未初始化的变量会产生未定义的行为,因此显式初始化变量被认为是一种很好的做法,即使它可能是多余的。
但是,与其在循环中初始化它,不如定义一个默认构造函数,它将在构造person
实例时初始化该实例的数据成员:
struct person
{
person() : value(0) { }
std::string name;
int value;
}
还要注意,使用STL容器(如std::vector
(比使用
要好得多C样式数组:(
如上所述,人[5]是的第六位
在C++中,不要使用数组,而是使用向量
有什么原因不能使用向量吗?这是他们C++的方式,这样会更容易,也不太可能出现错误。这里有一个例子:
#include <vector>
std::vector<person> a ;
a.push_back( person(...) ) ;
此外,如前所述,如果您需要使用数组,那么person
的默认构造函数可以确保以后不需要初始化。例如:
class person
{
public:
person() : value(0) {...} // default constructor
};
在声明数组的第一行,默认的person
构造函数将被调用5次(每个数组元素调用一次(。如果person
构造函数将name
和value
元素初始化为合理的值,则不需要循环。
不,它们不一样。
在第一个例子中:
person a[5];
您正在声明一个长度为5、类型为person的数组。
然而,这:
person[5]
这是无效的-没有变量名,没有要分配的内容,也没有可以稍后循环的内容。
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为