有一些关于c ++迭代器的基本问题。
说我有一个对象vector<vector<int>> vec2d
。
vector<vector<int>>::iterator i, iEnd;
i = vec2d.begin();
iEnd = vec2d.end();
我想知道i
是否是整个1D数组的迭代器?
(*i) [1]
是什么意思?
答案 0 :(得分:4)
我想知道我是否是整个1D数组的迭代器?
好吧,vec2d
是vector<int>
的向量,i
是vec2d
的迭代器。您可以考虑 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
}
}