I am having trouble understanding why I can't set values in a 2D matrix (a vector of vectors). If I use C-style loops or iterators it works, but it doesn't work if I use c++ range based loops. Can someone please explain why?
Thanks.
struct my_str {
int value;
my_str(int v) : value(v) {}
};
int main(int argc, char *argv[])
{
// Initialise with some dummy data (creates a 3 x 2 matrix)
vector<vector<my_str>> array2D;
for (int i=0; i<3; ++i) {
vector<my_str> tmp;
for (int j=0; j<2; ++j)
tmp.push_back( my_str(-999) );
array2D.push_back(tmp);
}
// Now try to replace the values
int ctr=0;
// Fails
for (auto array1D: array2D)
for (auto it: array1D)
it.value = (float)++ctr;
// Fails
for (auto array1D: array2D)
for (std::vector<my_str>::iterator it=array1D.begin(); it != array1D.end() ;++it)
(*it).value = (float)++ctr;
// Fails
for (int i=0; i<array2D.size(); i++)
for (auto array1D: array2D[i])
array1D.value = (float)++ctr;
// Works
for (std::vector<std::vector<my_str>>::iterator array1D=array2D.begin(); array1D != array2D.end() ;++array1D)
for (std::vector<my_str>::iterator it=array1D->begin(); it != array1D->end() ;++it)
(*it).value = (float)++ctr;
// Works
for (int i=0; i<array2D.size(); i++)
for (std::vector<my_str>::iterator it=(array2D[i]).begin(); it != (array2D[i]).end() ;++it)
it->value = (float)++ctr;
// Works
for (int i=0; i<array2D.size(); i++)
for (int j=0; j<(array2D[i]).size(); j++)
array2D[i][j].value = (float)++ctr;