C++需要一个中间变量来接受<vector <vector int >>中的迭代器

asa*_*bah -1 c++ pointers iterator c++11

以下生成错误:

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

vector<int> temp = *it1;
Run Code Online (Sandbox Code Playgroud)

然后:

for (auto it11 = temp.begin(); it11 != temp.end(); it11++);
Run Code Online (Sandbox Code Playgroud)

一切顺利.

知道为什么会这样吗?

Ste*_*eve 5

这是因为成员访问运算符.优先级高于解除引用运算符*.所以它试图访问begin()在方法it1(其中不存在),并随后尝试取消引用的结果.

代替

auto it11 =  *it1.begin();
Run Code Online (Sandbox Code Playgroud)

auto it11 =  it1->begin();
Run Code Online (Sandbox Code Playgroud)

这是你打算一步完成的事情.

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