简化为一个最小的可复制示例,我遇到问题的代码如下:
#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)
修复了这个问题。