c++ - 初始化 vector 数组,其中每个 vector 的大小为 0

标签 c++

我有一个类 Thing,它有一个构造函数 Thing::Thing() 和一个方法 Thing::print()。我正在尝试创建 arrayOfVectors,使数组中的每个 std::vector 的大小为 0。构造函数正确打印出每个 vector 的大小,但 print() 方法没有。

我尝试在数组中的每个 vector 上调用 arrayOfVectors[n].clear()arrayOfVectors[n].assign(0,0) 但没有工作。

Thing.hpp

class Thing {
private:
  std::vector<int>* arrayOfVectors;

public:
  Thing();
  void print() const;
};

Thing.cpp

Thing::Thing() {
  std::vector<int> arrayOfVectors[5];
  std::cout << arrayOfVectors[0].size() << std::endl; // 0
  std::cout << arrayOfVectors[1].size() << std::endl; // 0
  std::cout << arrayOfVectors[2].size() << std::endl; // 0
  std::cout << arrayOfVectors[3].size() << std::endl; // 0
  std::cout << arrayOfVectors[4].size() << std::endl; // 0
}

void Thing::print() const {
  std::cout << arrayOfVectors[0].size() << std::endl; // 0
  std::cout << arrayOfVectors[1].size() << std::endl; // 35183230189065
  std::cout << arrayOfVectors[2].size() << std::endl; // 33
  std::cout << arrayOfVectors[3].size() << std::endl; // 35
  std::cout << arrayOfVectors[4].size() << std::endl; // 108
}

main.cpp

int main() {
  Thing thing;
  thing.print();
  return 0;
}

最佳答案

Thing::Thing() {
  std::vector<int> store[5];
  ^^^^^^^^^^^^^^^^^^^^^^^^^

这是一个 vector 数组。它是一个自动变量。自动变量在创建它们的 block 的末尾被销毁。在这种情况下,本地数组在构造函数调用结束时被销毁。

class Thing {
private:
  std::vector<int>* arrayOfVectors;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这是一个指向 vector 的指针。它不是数组。它是类 Thing 的成员变量。它是一个完全独立于本地 store 变量的变量。

您的构造函数从不初始化成员变量,因此当您在 print 成员函数中间接指针时,程序的行为是未定义的。


如果你想让你的类有一个数组作为成员变量,你可以这样写:

class Thing {
private:
  std::vector<int> arrayOfVectors[5];

您无需声明构造函数,因为自动生成的构造函数完全符合您的要求 - 所有 vector 都将为空。


How can i avoid setting a specific number like 5 in the header definition?

您无法使用数组变量来避免这种情况。大小必须在编译时已知。如果你需要一个非固定大小的数组,你需要在动态存储中分配数组。创建动态数组的惯用方法是使用 std::vector:

class Thing {
private:
  std::vector<std::vector<int>> vectorOfVectors{5};

关于c++ - 初始化 vector 数组,其中每个 vector 的大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52808214/

相关文章:

c++ - 如何在解决方案中构建多个项目之前执行流程

c++ - Bazel - 导入静态库时包括目录中的所有 header

c++ - FSCANF 阅读撇号和连字符时遇到问题?

c++ - DirectX 9 着色器不显示错误

c++ - CRLF 行尾和 ostringstream

c++ - 指针上的运算符<(小于)是否一致?

c++ - 编译器是否允许省略非虚私有(private)成员函数?

C++ 映射 STL 错误 : size of array 'apn2policy' has non-integral type 'const char [13]'

c++ - 为什么我要在静态多态性的简单模板上使用 CRTP?

c++ - 压力-ng : Writing an application program using execv to invoke stress-ng commands and return if it is success or failure