STL(vector, map, stack)

Standard Template Library: 容器、迭代器、算法


***容器***
顺序容器:vector、deque、list
vector 从后面快速插入删除,直接访问任何元素
deque 从前面或后面快速的插入删除,直接访问任何元素
list 双链表,从任何地方快速插入删除

关联容器:map、set、multiset、multimap
是一种非线性的树结构,一种比较高效的特殊的平衡检索二叉树--红黑树。

容器适配器:stack、queue、priority_queue
是容器的接口,本身不能直接保存元素,其保存元素的机制是调用另一种顺序容器来实现。


***迭代器***:iterator

对容器中的对象进行访问,如同一个指针。
eg. vector<int>::iterator iter;
eg. list<string>::iterator iter;
eg. 使用迭代器遍历容器
for(vector<string>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
std::cout<< *iter <<std::endl;
}


***算法***
头文件 algorithm



代码1:vector.cpp

  1 /*
  2  * File: vector.cpp
  3  * ----------------
  4  * DATE: 20170817
  5  *
  6  */
  7 
  8 #include <iostream>
  9 #include <vector>
 10 #include <algorithm>
 11 
 12 void display(std::vector<int> &vec)
 13 {
 14         //迭代器
 15         for(std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
 16         {
 17                 std::cout<< *iter <<std::endl;
 18         }       
 19 }       
 20 
 21 //谓词 大于60
 22 bool operator_biger60(int a)
 23 {
 24         return a > 60;
 25 }       
 26 
 27 //谓词 降序排列
 28 bool sort_bigger(int a,int b)
 29 {
 30         return a > b;
 31 }       
 32 
 33 int main()
 34 {
 35         int array[] = {50,65,80,92,93,53,78};
 36         std::vector<int> vec(array,array+6);    //容器 vector<int>
 37         std::cout<< "before sort:" <<std::endl; 
 38         
 39         display(vec);
 40         
 41         //谓词
 42         std::cout<< "大于60个数:" << count_if(vec.begin(),vec.end(),operator_biger60) <<std::endl;
 43         
 44         //排序 谓词
 45         sort(vec.begin(),vec.end(),sort_bigger);
 46         std::cout<< "after sort:" <<std::endl;
 47         display(vec);
 48 
 49         //删除
 50         for(std::vector<int>::iterator iter = vec.begin();iter != vec.end();iter++)
 51         {
 52                 if(*iter < 60)
 53                 {
 54                         vec.erase(iter);        //容器长度的改变将使迭代器失效
 55                         iter = vec.begin();     //重新赋值 迭代器
 56                 }
 57         }
 58         std::cout<< "after delete:" <<std::endl;
 59         display(vec);
 60         return 0;
 61 }


代码2:map.cpp

  1 /*
  2  * FILE: map.cpp
  3  * -------------
  4  * DATE: 20170817
  5  *
  6  */
  7 
  8 #include <iostream>
  9 #include <map>
 10 #include <string>
 11 #include <algorithm>
 12 
 13 //map<key,value>
 14 //迭代器 map<int,string>::iterator iter
 15 void display(std::map<int,std::string> &m)
 16 {
 17         for(std::map<int,std::string>::iterator iter = m.begin();iter!=m.end();iter++)
 18         {
 19                 std::cout<< iter->first << "," << iter->second <<std::endl;
 20         }
 21 }
 22 
 23 int main()
 24 {
 25         std::map<int,std::string> m;
 26         m.insert(std::make_pair(1000,"张三"));  //使用make_pair 添加元素
 27         m.insert(std::pair<int,std::string>(1001,"李四"));      //使用pair<int,string>( , ) 添加元素
 28         m[1002]="王五"; //使用下标添加元素
 29         std::cout<< "before: " <<std::endl;
 30         display(m);
 31 
 32         //若存在,则修改
 33         if(m.count(1002))       //count 计数
 34         {
 35                 m[1002] = "麻五";
 36         }
 37         std::cout<< "after: " <<std::endl;
 38         display(m);
 39 
 40         return 0;
 41 }


代码3:stack.cpp

  1 /*
  2  * FILE: stack.cpp
  3  * ---------------
  4  * DATE:2017081e
  5  *
  6  */
  7 
  8 #include <iostream>
  9 #include <stack>
 10 #include <string>
 11 #include <list>
 12 
 13 int main()
 14 {
 15         /* stack 栈_后进先出 */
 16 
 17         //栈 默认基于set实现
 18         std::stack<int> num;    //定义 stack<int> num
 19 
 20         //修改 栈的基础容器,改为基于 list实现
 21         //stack<string, list<string> >  注意后面需要空格
 22         std::stack<std::string,std::list<std::string> >name;    //定义 stack<string,list<string> > name
 23         num.push(10);   //push()向栈中压入元素
 24         num.push(20);
 25         num.push(30);
 26 
 27         name.push("张三");      //push()向栈中压入元素
 28         name.push("李四");
 29         name.push("马五");
 30 
 31         std::cout<< "num size:" << num.size() <<std::endl;      //size()栈中元素的个数
 32         while(!num.empty())     //empty()栈是否为空
 33         {
 34                 std::cout<< num.top() <<std::endl;      //top()栈的顶部元素,即最后压入的元素
 35                 num.pop();      //pop()弹出
 36         }
 37 
 38         std::cout<< "name size:" << name.size() <<std::endl;
 39         while(!name.empty())
 40         {
 41                 std::cout<< name.top() <<std::endl;
 42                 name.pop();
 43         }
 44 
 45         return 0;
 46 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值