C ++需要一个中间变量来接受<vector <vector =“”int =“”>&gt;中的迭代器。

时间:2017-11-03 16:41:51

标签: c++ c++11 pointers iterator

以下生成错误:

int main() {

  mat_int mat1(5, vector<int>{1,2,3});
  mat_int mat2(5, vector<int>{4,5,6});

  for (auto it1 = mat1.begin(); it1 != mat1.end() ; ++it1) {
        for (auto it11 =  *it1.begin(); it11 != *it1.end(); it11++)
            cout << *it11;
        cout << '\n';
    }
}

编译器不接受内循环迭代器; /home/asabbah/programming/C++/vectors1.cpp:16:28:错误:'class __gnu_cxx :: __ normal_iterator *,std :: vector&gt; &gt;'没有名为'begin'的成员

但是,如果我插入一个临时变量:

vector<int> temp = *it1;

然后:

for (auto it11 = temp.begin(); it11 != temp.end(); it11++);
一切都很顺利。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

这是因为成员访问运算符.的{​​{3}}比取消引用运算符*多。因此,它会尝试访问begin()中的it1方法(它不存在),然后尝试取消引用结果。

而不是

auto it11 =  *it1.begin();

DO

auto it11 =  it1->begin();

您打算在一个步骤中执行哪些操作。

使用临时变量使编译器首先进行取消引用,然后尝试访问临时变量中的begin方法。