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));
}
我今天试图访问矢量元素,所以当我使用 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));
}