c++ - 无法在二维矩阵( vector 的 vector )中设置值

标签 c++ vector iterator

<分区>

我无法理解为什么我不能在 2D 矩阵( vector 的 vector )中设置值。如果我使用 C 风格的循环或迭代器,它可以工作,但如果我使用基于 c++ 范围的循环,它就不起作用。有人可以解释为什么吗?

谢谢。

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;

最佳答案

使用引用文献,否则你得到的是拷贝。

for (auto & array1D: array2D)
          ^
    for (auto & it: array1D)
              ^

auto在类型推导中不保留 const 或引用:

int i{0};
const int ci{0};
int & ri = i;
int const & cri = i;
auto a = i;   // int deduced
auto b = ci;  // int deduced
auto c = ri;  // int deduced
auto d = cri; // int deduced

在所有情况下,abcd 都是 i 的拷贝ci。对这些值的任何修改都不会影响 ici 的值。鉴于

auto & e = i; // int & deduced
e = 1; // i is modified

相同的规则适用于您的范围循环。

关于c++ - 无法在二维矩阵( vector 的 vector )中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48473268/

相关文章:

c++ - 用另一个新语句重置动态数组,需要先删除吗?

c++ - 比较器函数在优先队列中的工作

C++ 如何从字符串流中取出值并将它们放入 vector 中,以便我可以单独访问它们?

java - iterator.next() 返回替代对象

c++ - std::vector 迭代器失效

c++ - 无法在程序中指定文件路径前缀

c++ - 在跨平台应用程序中构建 VST 主机

c++ - 从 vector 返回 bool&

c++ - std::vector.size() 不工作

python - itertools.groupby() 生成的迭代器被意外消耗