只是有一些关于c ++迭代器的基本问题。
假设我有一个对象vector<vector<int>> vec2d
.
vector<vector<int>>::iterator i, iEnd;
i = vec2d.begin();
iEnd = vec2d.end();
我想知道i
是否是整个 1D 数组的迭代器?
这是什么(*i) [1]
意思?
我想知道我是否是整个 1D 数组的迭代器?
嗯,vec2d
是vector<int>
的向量,i
是vec2d
的迭代器。你可以考虑vec2d
一维向量的一维向量,如果是这样,i
是整个vec2d
的迭代器(如前所述,这是一个一维向量),或者你可以把它看作是ints
的二维向量(我认为这是不那么微不足道的选择)。
请注意,并非所有一维向量都是相同的。即使您将vec2d
视为 1d 向量,它也是vector<int>
的向量,因此像这个小恶作剧i = tmp2.begin();
(来自下面的例子)不会编译。
基本上,迭代器可以迭代特定的容器类型,无论是整数的向量,还是任何向量的向量。在我看来,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]
为您提供该内部容器的第二个元素。
请注意,*i[0] != (*i)[0]
是因为运算符优先级(在我的示例中,它甚至不编译)。
然后(*i)[1]
访问当前迭代器的第二个元素。假设没有其他代码,则计算结果与示例中vec2d[0][1]
相同。
因为vec2d
的模板参数是vector<int>
,所以你的迭代器i
将取消引用vector<int>
(如你所说,一个一维数组)。如果你问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
}
}