vector<vector<int>> vec 和 vector<vector<int>> vec(n) 有什么区别?

What's the difference between vector<vector<int>> vec and vector<vector<int>> vec(n)?

我今天试图访问矢量元素,所以当我使用 vector<vector<int>> vec 然后向其中添加元素时。我能够访问像 vec[1][2].

这样的元素

但是当我使用 vector<vector<int>> vec(n) 然后添加元素时,我无法使用 vec[1][2] 访问这些元素。我一直收到分段错误。有谁知道我在这里错过了什么?

我正在借助以下代码片段将元素添加到向量中。

int n;
cin >> n;
vector<vector<int>> vh;
int size, input;
for (int i = 0; i < n; i++)
{
    vector<int> temp;
    cin >> size;
    for (int j = 0; j < size; j++)
    {
        cin >> input;
        temp.push_back(input);
    }
    vh.push_back(temp);
}

我想我可以猜猜问题是什么...

当您使用带参数的构造函数时:

vector<vector<int>> vh(n);

您创建了一个大小为 n 的向量,这意味着它已经有 n 个元素,其中每个元素都是默认构造的 vector<int>。这意味着每个向量都是 empty.

然后你推回一个新向量:

vh.push_back(temp);

这将增加 向量的大小。在一个这样的 push_back 调用之后 vh 的大小将是 n + 1。您添加的新矢量将在索引 n 处,即 vh[n] 是新矢量。

如果在定义vector的时候设置了size,那么需要使用索引和赋值来设置子vector:

vh[i] = temp;

总结:

  • 要么创建一个空向量并推回新元素:

    vector<vector<int>> vh;
    

    vh.push_back(temp);
    
  • 或者您创建一个具有大小的向量,并使用索引和赋值:

    vector<vector<int>> vh(n);
    

    v[i] = temp;
    

不要混用这些方法。


现在,当您让当前代码正常工作(希望如此)并了解这些东西如何更好地工作时,是时候展示一种如何以更“C++ 风格”的方式编写代码的方法了...: )

// The first part is much like your current code
size_t n;
std::cin >> n;
std::vector<std::vector<int>> vh(n);

// Now iterate over all the elements in the vector
for (auto& v : vh)
{
    // Get the size of the current sub-vector
    size_t size;
    std::cin >> size;

    // Create the vector with size elements
    v = std::vector<int>(size);

    // Read size integers into the vector
    std::copy_n(std::istream_iterator<int>(std::cin), size, begin(v));
}