C++:向量<向量<int>>迭代器?



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

假设我有一个对象vector<vector<int>> vec2d.

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

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

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

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

嗯,vec2dvector<int>的向量,ivec2d的迭代器。你可以考虑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
}
}

最新更新