C++STL学习

STL(standared Template Library)

STL被内建在编译系统之内。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。

主要有六大组件:容器(containers)、迭代器(iterators)、空间分配器(allocator)、适配器(adaptors)、算法(algorithms)、仿函数(functors)。

a.迭代器(iterator)是连接容器和算法的纽带,为数据提供了抽象,使写算法的人不必关心各种数据结构的细节

b.主要包括三种:正向迭代器(支持++)、双向迭代器(支持++、--)、随机访问迭代器(支持++、--、随机访问);

c.在这三大类的迭代器下各自又分为两小类:常量迭代器可变迭代器,常量迭代器不能改变元素的值。

d.输入迭代器输出迭代器本质均是正向迭代器,对元素只能解析一次,只是一个只能用于输入流,一个只能用于输出流。

e.逆向迭代器则是依托在双向迭代器之上。

泛型编程的关键所在,就是如何找到一种通用的方法,来访问具有不同结构的各种容器中的每个元素,而这正是迭代器的功能。

迭代器是一种广义的指针,是指向序列元素指针概念的一种抽象。迭代器可以指向容器中的任意元素,还能遍历整个容器。

在C++标准中,STL被组织为下面的13个头文件:

<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>。

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <stack>
#include <set>
#include <map>
#include <fstream>  
#include <iterator> //istream_iterator,ostream_iterator,back_inserter  
#include <algorithm> //copy  
#include <Windows.h> //system  
using namespace std;
#pragma message("liujun") 


//判断某个字符是否出现在map里面
bool In(char ch,map <char,int> op)
{
if(op.find(ch)!=op.end())
return true;
else
return false;
}


//双操作数运算
double Operate(double operand1,char optr,double operand2)
{
double result=0;
switch(optr)
{
case '+':result=operand1+operand2;break;
case '-':result=operand1-operand2;break;
   case '*':result=operand1*operand2;break;
case '/':result=operand1/operand2;break;
}
return result;
}


//返回负数表明optr1>optr2;返回0表明optr1=optr2;返回正表明optr1<optr2;
int  OptrCompare(char optr1,char optr2,map <char,int> op_map)
{
return op_map.find(optr1)->second-op_map.find(optr2)->second;
}


void Stack_Disp(stack <char> sta)
{
while(!sta.empty())
{
cout <<sta.top();
sta.pop();
}
return;
}


void Stack_Disp(stack <double> sta)
{
while(!sta.empty())
{
cout << sta.top();
sta.pop();
}
return;
}


int _tmain(int argc, _TCHAR* argv[])
{
typedef vector<char>       char_vector;
typedef istream_iterator<char>   istream_itr;
typedef ostream_iterator<char>   ostream_itr;
typedef back_insert_iterator< char_vector >back_ins_itr;


char_vector expression;
stack < double >  opnd;//操作数堆栈
stack < char >  optr;//算符堆栈
map   <char ,int> op_map;//运算符map
map   <char,int>::iterator it;
char_vector:: iterator char_it;




    op_map['+']=2;  
    op_map['-']=2;  
    op_map['*']=1;  
    op_map['/']=1; 


cout<<"运算符表"<<endl;
for(it=op_map.begin();it!=op_map.end();it++)
cout<<it->first<<"->"<<(*it).second<<" ";
cout<<endl;


copy(istream_itr(cin), istream_itr(), back_ins_itr(expression));
cout<<"cin over"<<endl;
cout<<"expression output"<<endl;
copy(expression.begin(), expression.end(), ostream_itr(cout));
cout<<endl;


for(char_it=expression.begin();char_it!=expression.end(); char_it++)
{
if(In(*char_it,op_map))//如果是界限符(运算符+界限符)
{
optr.push(*char_it);
}
else//是操作符
{
opnd.push(*char_it);
}
}

cout<<"表达式中的运算符"<<endl;
Stack_Disp(optr);
cout<<endl;
cout<<"表达式中的操作数"<<endl;
Stack_Disp(opnd);
cout<<endl;
system("pause");
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值