STL的基本组件
一、容器,迭代器,算法,函数对象
用具体情况举例说明四者关系。
下面从针对一个具体的数据类型到多种数据类型来编写一个图中的transform
1、首先确定的容器类型,数组,算法为直接取负
先测试确定容器,数组,确定算法,函数
void transInv(int a[],int b[],int nNum){
for(int i =0; i<nNum; i++){
b[i]= - a[i]; //确定算法 -()
}
}
void output(string name, ostream&os, int a[], int Nnum){
os<<name<<"\t";
for(int i = 0; i<Nnum; i++){
os<<a[i]<<"\t";
}
os<<endl;
}
2、可以对多种数据类型操作的取反算法(不确定的容器类型,确定的算法)
不确定序列容器的,确定算法,函数
template<typename Input, typename Output>
void transInv(Input Inputbegin, Input Inputend, Output outputbegin){
for(;Inputbegin!=Inputend;Inputbegin++,outputbegin++){
*outputbegin = -(*Inputbegin);
}
}
template<typename T>
void output(string name, ostream&os, T begin, T end){
os<<name<<"\t";
for(;begin!=end;begin++){
os<<*begin<<"\t";
}
os<<endl;
}
3、可以对多种数据执行不同的算法(不确定的容器类型和多种算法)
template<typename T>
T op(T input){
return input*input;
}
不确定算法
template<typename Input, typename Output, typename Operator>
void transInv(Input Inputbegin, Input Inputend, Output outputbegin,Operator op){
for(;Inputbegin!=Inputend;Inputbegin++,outputbegin++){
*outputbegin = op(*Inputbegin);
}
}
对上面三个情况测试
void TestCont(){
int nNum = 6;
int a[nNum] ={1,2,3,4,5,6};
output("a",cout,a,6);
int b[nNum];
transInv(a,b,nNum);
output("b",cout,b,6);
vector<double> vb(nNum);
//vector<double> vb();
transInv(a,a+6,vb.begin());
output("vb",cout,vb.begin(),vb.end());
transInv(a,a+6,vb.begin(),op<int>);
output("vb",cout,vb.begin(),vb.end());
}
结果
1、容器
序列容器:排列次序取决于插入时机和位置
关联式容器:排列次序取决于特定准则
2、迭代器
3、函数对象
4、算法
二、set的使用
set存放学生信息,并进行增删改查
void TestStudentSet(){
cout<<endl;
set<studentInfo> studentSet;
//增加
studentSet.insert(studentInfo("Liyuxiang","21"));
studentSet.insert(studentInfo("Xuxiangdong","14"));
studentSet.insert(studentInfo("Lianjunwei","13"));
output("studentSet",cout,studentSet.begin(),studentSet.end());
//删除
studentSet.erase(studentInfo("Xuxiangdong","14"));
output("studentSet",cout,studentSet.begin(),studentSet.end());
//查找
set<studentInfo>::iterator iter;
iter=studentSet.find(studentInfo("Lianjunwei","13"));
cout<<*iter<<endl;
//cout<<iter->_stuNam<<endl;
//修改
//iter 是常指针,
//*iter->_stuNam ="Xuxiangdong",不可行;
const_cast<studentInfo*>(&(*iter))->_stuNam = "XUXU";
cout<<iter->_stuNam;
output("studentSet",cout,studentSet.begin(),studentSet.end());
//破坏结构
const_cast<studentInfo*>(&(*iter))->_stuNum = "23";
cout<<iter->_stuNum<<endl;
output("studentSet",cout,studentSet.begin(),studentSet.end());
studentSet.insert(studentInfo("Liyuxiang","22"));
output("studentSet",cout,studentSet.begin(),studentSet.end());
}
结果
要提的是,修改13为23破坏了set的结构
三、map的使用
对字符串统计各字符个数
void TestMap(){
map<char, int> s;
char c[20]="gsudhfogiert";
for(int i = 0; i<20; i++){
if(isalpha(c[i])){
c[i]=tolower(c[i]);
s[c[i]]++;
}
}
for(map<char,int>::iterator iter = s.begin(); iter != s.end(); iter++)
cout<< iter->first<<" "<<iter->second<<endl;
}
结果