STL六大组建:
1. 容器(Containers)-各种数据结构(vector list string 等) 2. 算法(Algorithms)-基本常见算法 (sort search copy等) 3. 迭代器(Iterator)-扮演容器和算法之间的胶合物,称为 “泛型指针” ,每一种容器都是实现了iterator ,例如对vector进行排序时的参数为迭代器 4. 空间配置器(Allocators)-负责内存空间的分配与管理 5. 配接器(Adapters)-一种修饰容器、仿函数、迭代器接口的东西,例如我们可以用list 适配出栈,用vector适配出队列 6. 仿函数(Functors)-类似于函数对象,用作算法的策略选择,例如按升序排序时用到less() 在之前我们也模拟实现了一部分容器 ,string ,vector ,list |
vector和list中迭代器和基本算法中的一些使用
//TODO
#include <stdio.h>
#include <string>
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>//注意这个单词尽量记住
using namespace std;
//定义模板函数来进行打印容器中的内容(使用迭代器)
template<class container>
void PrintContainers(const container &con)
{
class container::const_iterator it=con.begin();
//因为参数为const 所以这里的迭代器也要用const_iterator
while(it!=con.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
}
//用模板函数反向打印顺序表(使用反向迭代器)
template<class container>
void ReversePrintContainers( const container & con )
{
class container::const_reverse_iterator it=con.rbegin();
while(it!=con.rend())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
}
//自定义策略,比较函数, great()降序排序
struct My_great
{
bool operator()(int i,int j)
{
return i>j;
}
};
void vector_test()
{
vector<int> v1;
v1.push_back(2);
v1.push_back(5);
v1.push_back(3);
v1.push_back(1);
v1.push_back(4);
//用模板函数来实现打印顺序表
PrintContainers(v1);
//用模板函数反向打印顺序表
ReversePrintContainers(v1);
//对顺序表来进行排序(1)这里的v1.begin()和v1.end()为两个迭代器。分别为要排序的开始位置和要排序的结束位置
sort(v1.begin(),v1.end());
PrintContainers(v1);
对顺序表进行排序(2)(自定义策略)
//sort(v1.begin(),v1.end(),My_great());
//PrintContainers(v1);
//对顺序表进行排序(3)(自定义策略,用仿函数)
sort(v1.begin(),v1.end(),greater<int>());
PrintContainers(v1);
//对顺序表中某一元素之前进行插入
//顺序表中的insert给的是某个位置,若想在某个元素之前进行插入,必须找到该元素的位置
//这里查找该元素的位置用到算法中的find()
//find()函数原型:InputIterator find (InputIterator first, InputIterator last, const T& val);
vector<int>::iterator find_ret=find(v1.begin(),v1.end(),3);
printf("在3之前插入88\n");
v1.insert(find_ret,88);
PrintContainers(v1);
//对于vector一般不用insert()接口
//如何将顺序表销毁
//我们直到clear()函数只是将顺序表中的数据清空
{
vector<int> tmp;
tmp.swap(v1);
}
//这里采用限制tmp对象的生命周期
//将v1与tmp进行交换
//则v1为空,且tmp出作用域就会释放
printf("将v1释放后\n");
PrintContainers(v1);
}
void list_test()
{
list<string> L;
L.push_back("aaaa");
L.push_back("bbbb");
L.push_back("cccc");
L.push_back("dddd");
L.push_back("eeee");
L.push_back("ffff");
//利用模板函数打印list中的内容
PrintContainers(L);
//用模板函数反向打印链表
ReversePrintContainers(L);
//对链表中某一元素之前进行插入
//链表表中的insert给的是某个位置,若想在某个元素之前进行插入,必须找到该元素的位置
//这里查找该元素的位置用到算法中的find()
//find()函数原型:InputIterator find (InputIterator first, InputIterator last, const T& val);
list<string>::iterator find_ret=find(L.begin(),L.end(),"bbbb");
printf("在3之前插入hello\n");
L.insert(find_ret,"hello");
PrintContainers(L);
}
int main()
{
vector_test();
list_test();
return 0;
}
迭代器的总结:
- 迭代器的本质是一种类似于指针的对象,指针的所有操作迭代器都应该支持,因此,迭代器只需要在类中重载指针的操作
- 迭代器是算法和容器的粘合剂,同一个算法可以操作不同的类型的容器
在不破坏类的封装性的前提下,不用关心内部实现细节来访问数据(读和写)
从上面的打印函数来看,我们用相同的方法可以实现对vector和list的遍历和打印
完