C++:std::vector<std::vector<T>>在通过引用传递到填充函数时作为空向量的向量返回
简化为最小的可重现示例,我遇到问题的代码如下:
#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实际上是引用 whichof 已传递给函数的向量的子向量的副本,因此我对它所做的更改自然不会反映在实际的子向量中。将此行更改为
for (vector<char>& subarray : data)
修复了问题。
THE END
二维码