C ++:vector <vector <int>&gt;迭代器?

时间:2017-08-29 04:40:45

标签: c++ iterator

有一些关于c ++迭代器的基本问题。

说我有一个对象vector<vector<int>> vec2d

vector<vector<int>>::iterator i, iEnd;
i = vec2d.begin();
iEnd = vec2d.end();

我想知道i是否是整个1D数组的迭代器?

(*i) [1]是什么意思?

3 个答案:

答案 0 :(得分:4)

  

我想知道我是否是整个1D数组的迭代器?

好吧,vec2dvector<int>的向量,ivec2d的迭代器。您可以考虑 1d 向量的vec2d 1d 向量,如果是,i是整个vec2d的迭代器(也就是说,如上所述,1-d矢量),你可以将它看作ints 2d 向量(我认为它不那么琐碎选项)。

请注意,并非所有1d向量都相同。即使你将vec2d视为1d向量,它的向量 OF vector<int>,因此类似于这个小的shenanigan i = tmp2.begin();(来自我的示例)不会编译。

基本上迭代器可以迭代特定的容器类型,无论是int的向量,还是向量的向量。正如我所看到的,1d和2d向量之间的区别不是问题。

  

那是什么(* i)[1]是什么意思?

请考虑以下事项:

#include <iostream>
#include <vector>
using namespace std;

int main(){

    vector< vector<int> > vec2d;

    vector<int> tmp1;
    tmp1.push_back(1);
    tmp1.push_back(2);

    vector<int> tmp2;
    tmp2.push_back(3);
    tmp2.push_back(4);

    vec2d.push_back(tmp1);
    vec2d.push_back(tmp2);

    vector< vector<int> >::iterator i, iEnd;
    i = vec2d.begin();
    iEnd = vec2d.end();

    cout << (*i)[1] << endl;        // outputs 2 (same as vec2d[0][1])
    cout << vec2d[0][1] << endl;    // outputs 2
    cout << vec2d[1][0] << endl;    // outputs 3
    cout << vec2d[1][1] << endl;    // outputs 4

    return 0;
}

正如您所看到的,*i带您“内部”您迭代的容器(在您的情况下为vec2d),[1]为您提供该内部容器的 2nd 元素。

请注意*i[0] != (*i)[0]因为运算符优先级(在我的示例中,它甚至不编译)。

答案 1 :(得分:1)

(*i)[1]然后访问当前迭代器的第二个元素。假设没有其他代码,这将与您示例中的vec2d[0][1]进行评估。

答案 2 :(得分:1)

由于vec2d的模板参数为vector<int>,因此您的迭代器i将取消引用vector<int>(正如您所说的那样是1d数组)。如果你在询问vec2d本身是否是一个大的连续内存数组,那么不,vec2d的每个元素都指向它自己的资源,而一个向量元素的迭代器不能迭代到下一个。 (*i) [1]相当于i[0][1],并访问vec2d内第一个向量的第二个。您可以使用以下内容迭代vec2d内的所有整数:

for (vector<vector<int>>::iterator i = vec2d.begin(); i != vec2d.end(); ++i) {
    for (vector<int>::iterator j = i->begin(); j != i->end(); ++j) {
        cout << *j; // do something with *j
    }
}