vector 与迭代器的配合使用
开发工具与关键技术:Visual Studio、C++
作者:张国军
撰写时间:2019年06月 27日
每一个容器都会给出自己的迭代器iterator。那么我们先来看一下vector容器的迭代器。
先看一个例子:
#include <iostream>
#include <vector>
using namespace std;
void main() {
vector<int> vecInt;
vector<int>::iterator it;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
for (it = vecInt.begin(); it != vecInt.end(); ++it)
{
cout << *it <<" ";
}
cout << endl;
}
从上边这个例子我们可以看出。迭代器,相当于我们的指针it = vecInt.begin();迭代器指针指向开始,it != vecInt.end();迭代器的指针不等于我们容器的结尾,++it指针加加,然后当我们需要输出的时候我们就需要对我们的迭代器指针进行解址操作,cout << *it <<" ";然后可以cout输出。
当然 ,我们迭代器可以从容器的开始输出,那么我们可以试着尝试一下从后边倒着输出,我们都知道迭代器是一个指针,那么我想它指向的地址然后进行减减也是一样的。
那么我们下边来看一个例子吧:
#include <iostream>
#include <vector>
using namespace std;
void main() {
vector<int> vecInt;
vector<int>::iterator it;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
for (it = vecInt.end(); it != vecInt.begin(); --it)
{
cout << *it;
}
cout << endl;
}
正常情况下的,我们很多人也会这么想,但是它就会报错,因为我们对vecInt.end()进行解址的时候系统就会给我们报错可以是我们访问了不属于我们的内存,那么我们可以在另外一方面理解,那就是我们的数学方面包含或者不包含的意思。也就相当于容器[begin(),end()},所以我就将我们的代码做了一个简单的处理
for (it = vecInt.end()-1; it != vecInt.begin(); --it)
{
cout << *it;
}
这个时候呢,我们可以从结果可以看到的我们的数据可以正确的输出,但是少了一个数据,那就是我们begin()数据,其实我们的指针已经走到我们begin()这里,只是并没有对它进行解址而已,所以我在下边再进行解址一次
for (it = vecInt.end()-1; it != vecInt.begin(); --it)
{
cout << *it;
}
cout << *it;
这样子我们的数据就完完全全的出来了。
但是有一个问题就是,这样子太麻烦了,所以在这里给大家一个另外一个写法,我们看一下下边这个例子:
#include <iostream>
#include <vector>
using namespace std;
void main() {
vector<int> vecInt;
vector<int>::iterator it;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
vector<int>::reverse_iterator rit;
for (rit = vecInt.rbegin(); rit != vecInt.rend(); ++rit)
{
cout << *it;
}
cout << endl;
}
输出来的结果的跟我们上边那个是一样的。 reverse是相反的意思,所以我们可以用这个输出我们需要到过来的数据。