c++ - 数据成员应该写在构造函数的初始化列表中吗?数组和向量的不同实现?
问题描述
在创建定义大小的向量以在类中进一步使用时,是否有必要将数据成员的构造函数的参数写入我的类构造函数的初始化列表中?
为什么
class MyHashMap {
public:
vector<int> vec;
MyHashMap():vec(1000001) {
fill(vec.begin(), vec.begin() + 1000000, -1);
}
有效,但是,
class MyHashMap {
public:
vector<int> vec(1000001);
MyHashMap() {
fill(vec.begin(), vec.begin() + 1000000, -1);
}
不起作用并给出错误,例如
Line 4: Char 22: error: expected parameter declarator
vector<int> vec (1000001);
^
如果使用数组完成相同的实现,
class MyHashMap {
public:
int data[1000001];
MyHashMap() {
fill(data, data + 1000000, -1);
}
没有问题。
如果有人可以帮助我,那我仍然是 C++ 的初学者,那就太好了。谢谢
解决方案
您不能像您尝试的那样,直接在其声明内联中使用括号将参数传递给类成员的构造函数。您需要:
- 使用父类的成员初始化列表:
class MyHashMap {
public:
vector<int> vec;
MyHashMap() : vec(1000001, -1) {}
- 在 C++11 及更高版本中,您可以使用初始化程序:
class MyHashMap {
public:
vector<int> vec = vector<int>(1000001, -1);
MyHashMap() = default;
- 或者,您可以使用花括号代替括号:
class MyHashMap {
public:
vector<int> vec{1000001, -1};
MyHashMap() = default;
但是请注意,在最后一种情况下,由于std::vector
有一个将 astd::initializer_list
作为输入的构造函数,因此此语法实际上将仅使用 2 个值为1000001
and的元素创建向量-1
,它不会调用 2-param 构造函数来创建向量1000001 个元素的值-1
。
推荐阅读
- java - 打开失败:EROFS(只读文件系统)[Android Studio Java]
- docker - 为什么 dockerhub 不在不同的存储库之间共享基础镜像?
- html - 是否可以找到react项目的监听事件
- ios - SwiftUI 如何将 contextMenu 添加到列表行中的图像并保持圆角并且不显示整行?
- hashmap - 从 Java 中的嵌套哈希图中访问键和值
- pyspark - 属性错误“groupeddata”对象没有找到属性“join”
- php - 回显属于用户的表中的最新行
- flutter - 如何通过文档 ID 获取 Firestore 集合快照
- python - 为什么python不通过迭代替换列表的新值?
- java - Spring Batch - 最大工人数?