STL的迭代器
向量和集合
假设存在一个向量
#include<iostream>
#include<vector>
using namespace std;
int main()
{
// 定义向量
vector<double> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
// 其余函数
}
针对该类型的输出形式:
// 1.以数组形式输出
for(int i=0;i<5;i++)
{
cout << a[i] << " ";
}
但倘若改成集合类型,那么会发生什么呢?
#include<iostream>
#include<set>
using namespace std;
int main()
{
// 定义集合
set<double> b;
b.insert(1);
b.insert(2);
b.insert(1);
b.insert(100);
cout << b.size() << " ";
// 其余函数
}
其中,b的大小只有2(因为集合的互异性)
此时若仍用for循环的数组方式输出,则会报错
list类
由此,我们再考虑list类的特点,双向链表。使用头文件**<list>**
#include<iostream>
#include<list>
using namespace std;
int main()
{
// 定义向量
list<int> c;
c.push_back(1);
c.push_back(2);
c.push_back(3);
c.push_back(4);
c.push_back(5);
// 其余函数
}
则此时,我们尝试输出 c 的size和其中的内容
cout << c.size();
for(int i=0;i<c.size();i++)
{
cout << c[i] << " ";
}
但很显然的会出现报错,因为不支持**c[i]**的输出形式
此时,我们很自然的引入一个概念——迭代器
迭代器
vector<double>:: iterator A;
for(A = a.begin();A != a.end();A++)
{
cout << *A << " ";
}
通过使用迭代器,能够输出向量a中的内容
set<double>:: iterator B;
for(B = b.begin();B != b.end();B++)
{
cout << *B << " ";
}
通过迭代器,也能对集合进行输出
list<int>:: iterator C;
for(C = c.begin();C != c.end();C++)
{
cout << *C << " ";
}
通过迭代器,还能对链表进行输出
而在其中,我们使用的**.begin和.end**是一种类似于指针的存在,能够适用于很多类型的数据,具有一种普适性
排序功能
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
// 定义向量
vector<double> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
// 对向量进行排序
sort(a.begin(),a.end());
// 其余函数
}
与上面相同,**sort()**函数由于使用的是父类的迭代器
sort(itorator)
因此它能够适用于多种数据类型的排序