C++:std::vector<std::vector<T>> 当通过引用传递到填充函数时,作为空向量的向量返回
C++: std::vector<std::vector<T>> comes back as a vector of empty vectors when passed into a fill function by reference
精简为最小的可重现示例,我遇到问题的代码如下:
#include <iostream>
#include <vector>
using namespace std;
void fill_vector_of_vectors(vector<vector<char>>& data) // I gave up on trying to think up a proper name for this
{
data.clear();
data.resize(4);
for (vector<char> subarray : data)
{
subarray.resize(4, 'x');
}
}
int main()
{
vector<vector<char>> data;
fill_vector_of_vectors(data);
for (vector<char> subarray : data)
{
for (char must_be_x: subarray)
{
cout << must_be_x;
}
cout << "\n";
}
return 0;
}
预期输出为
xxxx
xxxx
xxxx
xxxx
但是代码实际输出的是四个空行。通过调试器,我发现填充函数确实正确地填充了子向量,但是 main()
中的子向量是空的。我在哪里丢失了数据?
在填充函数中对子向量所做的更改没有反映在它外部的上下文中的原因是迭代 for
语句的误用。在这一行中,
for (vector<char> subarray : data)
subarray
实际上是传递给函数的引用向量的子向量的副本,所以我对它所做的更改自然不会反映在实际的子向量中。将此行更改为
for (vector<char>& subarray : data)
已解决问题。
精简为最小的可重现示例,我遇到问题的代码如下:
#include <iostream>
#include <vector>
using namespace std;
void fill_vector_of_vectors(vector<vector<char>>& data) // I gave up on trying to think up a proper name for this
{
data.clear();
data.resize(4);
for (vector<char> subarray : data)
{
subarray.resize(4, 'x');
}
}
int main()
{
vector<vector<char>> data;
fill_vector_of_vectors(data);
for (vector<char> subarray : data)
{
for (char must_be_x: subarray)
{
cout << must_be_x;
}
cout << "\n";
}
return 0;
}
预期输出为
xxxx
xxxx
xxxx
xxxx
但是代码实际输出的是四个空行。通过调试器,我发现填充函数确实正确地填充了子向量,但是 main()
中的子向量是空的。我在哪里丢失了数据?
在填充函数中对子向量所做的更改没有反映在它外部的上下文中的原因是迭代 for
语句的误用。在这一行中,
for (vector<char> subarray : data)
subarray
实际上是传递给函数的引用向量的子向量的副本,所以我对它所做的更改自然不会反映在实际的子向量中。将此行更改为
for (vector<char>& subarray : data)
已解决问题。