STL六大组建-----初始

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的遍历和打印

猜你喜欢

转载自blog.csdn.net/misszhoudandan/article/details/80739746