序列(sequence)容器与关联(associative)容器。
#include <iostream>
using namespace std;
#include <vector>
#include <string>
class Person //声明Person类
{public:
Person(char *Name, char Sex, int Age ) //构造函数
{ strcpy(name, Name); sex = Sex; age = Age; }
~Person( ){ } //析构函数
void Show( )
{ cout << " The person’s name: " << name << endl;
cout << " sex: " << sex << endl;
cout << " age: " << age << endl;
}
private: //私有数据成员
char name[11]; //姓名,不超过5个汉字
char sex; //性别,M:男,F:女
int age; //年龄
};
int main( )
{ vector<Person> v; //构造空向量v
Person person1("Tom", 'M', 18);
v.push_back(person1); //在向量v的尾部插入person1
Person person2("Mary", 'F', 19);
v.push_back(person2); //在向量v的尾部插入person2
Person person3("Mike", 'M', 19);
v.push_back(person3); //在向量v的尾部插入person3
for ( int i = 0; i < 3; i++ ) v[i].Show();
return 0; }
程序运行结果如下:
Theperson’s name: Tom
sex: M
age: 18
Theperson’s name: Mary
sex: F
age: 19
Theperson’s name: Mike
sex: M
age: 19
1.2 list(表)#include<iostream>
#include<list> //链表头文件
using namespace std;
int main(){
int i;
list<int> L1,L2;
int a1[]={100,90,80,70,60};
int a2[]={30,40,50,60,60,60,80};
for(i=0;i<5;i++) L1.push_back(a1[i]);
for(i=0;i<7;i++) L2.push_back(a2[i]);
L1.reverse(); //将L1链表倒序
L1.merge(L2); //将L2合并到L1链表中
cout<<"L1的元素个数为:"<<L1.size()<<endl;
L1.unique(); //删除L1中相邻位置的相同元素,只留1个
while(!L1.empty()){
cout<<L1.front()<<"\t";
L1.pop_front(); //删除L1的链首元素
}
cout<<endl;
return 0;
}
程序运行结果如下:
L1的元素个数为:12
30 40 50 60 70 80 90 100
1.3 stack (堆栈)
#include<iostream>
#include<set>
using namespace std;
int main()
{ set<int> s;
set<int>::iterator ps;
multiset <int> ms;
multiset<int>::iterator pms;
s.insert(1); s.insert(8); s.insert(2); s.insert(1);
ms.insert(1); ms.insert(8); ms.insert(2); ms.insert(1);
cout<<" the set:"<<endl;
for(ps=s.begin();ps!=s.end();ps++)
cout<<*ps<<" ";
cout<<endl;
cout<<" the multiset:"<<endl;
for(pms=q.begin();pms!=q.end();pms++)
cout<<*pms<<" ";
cout<<endl;
return 0;
}
程序运行结果如下:
theset:
1 2 8
themultiset:
1 1 2 8
注意:与char*字符串不同的是,string类型的字符串不一定以“\0”终止,其长度可用成员函数length读取,可用下标运算符[]访问其中的单个字符,起始下标为0,终止下标是字符串长度减1。
#include<iostream>
#include<list>
using namespace std;
int main(){
int i;
//L1、L2为空链表,L3为有10个元素的链表
list<int> L1, L2, L3(10);
list<int>::iterator iter; //定义迭代器iter
int a1[]={100,90,80,70,60};
int a2[]={30,40,50,60,60,60,80};
//插入L1链表元素,在表尾插入
for(i=0;i<5;i++)
L1.push_back(a1[i]);
//插入L2链表元素,在表头插入
for(i=0;i<7;i++)
L2.push_front(a2[i]);
//通过迭代器顺序输出L1的所有元素
for(iter=L1.begin();iter!=L1.end();iter++)
cout<<*iter<<"\t";
cout<<endl;
int sum=0;
//通过迭代器反向输出L2的所有元素
for(iter=--L2.end();iter!=L2.begin();iter--){
cout<<*iter<<"\t";
sum+=*iter; //计算L2所有链表节点的总和
}
cout<<"\nL2: sum="<<sum<<endl;
int data=0;
//通过迭代器修改L3链表的内容
for(iter=L3.begin();iter!=L3.end();iter++)
*iter=data+=10;
//通过迭代器输出L3的内容
for(iter=L3.begin();iter!=L3.end();iter++)
cout<<*iter<<"\t";
cout<<endl;
//通过迭代器反序输出L3的所有元素
for ( iter = --L3.end( ); iter != L3.begin( ); iter-- )
cout << *iter << "\t";
cout << *L3.begin( ) << endl;
//通过逆向迭代器反序输出L3的所有元素
for ( rsiter = --L3.rend( ); rsiter != L3.rbegin( ); rsiter-- )
cout << *rsiter << "\t";
cout << *L3.rbegin( ) << endl;
return 0;
}
3、算法
#include <iostream>
#include <string> //用于人机界面交互
#include <vector> //为了使用vector容器
#include <algorithm> //为了使用sort算法
#include <iterator> //为了使用输入输出迭代器
using namespace std;
int main(void) {
typedef vector<int> IntVector;
typedef istream_iterator<int> IstreamItr;
typedef ostream_iterator<int> OstreamItr;
typedef back_insert_iterator< IntVector > BackInsItr;
// STL中的vector容器
IntVector num;
//从标准输入设备读入整数,直到输入的是非整型数据为止
cout << "请输入整数序列,按任意非数字键并回车结束输入\n";
copy(IstreamItr(cin), IstreamItr(), BackInsItr(num));
//提示程序状态
cout << "排序中……\n";
// STL中的排序算法
sort(num.begin(), num.end());
cout<<"排序完毕的整数序列:\n";
copy(num.begin(), num.end(), OstreamItr(cout, "\n"));
//使输出窗口暂停以观察结果
system("pause");
return 0;
}
4、函数对象
template<class RandomAccessIterator>
voidsort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
voidsort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
#include <iostream>
using namespace std;
#include <algorithm>
#include <functional>
int main( )
{ int a[] = {1,3,2,4,5,7};
sort(&a[0], &a[6]); //递增排序
for(int i = 0; i < 6; i++) cout<<a[i]<<' ';
cout<<endl;
sort(&a[0], &a[6], greater<int>()); //递减排序
for(int i = 0; i < 6; i++) cout<<a[i]<<' ';
cout<<endl;
return 0;
}
简单地说,函数对象其实就是一些使用起来像调用函数一样的对象,如:一般的函数,函数指针,或重载了函数调用运算符()的类的实例等,使用这些对象的方式好像调用函数一样,所以称这些对象为函数对象。
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void Print(int x) //普通函数
{ if(x>=0&&x<=100) cout<<x<< " "; }
typedef void(*ptPrint)(int x);
ptPrint prt=Print; //函数对象指针
class cPrint //重载了( )运算符的类cPrint
{public:
void operator () (int val)
{ if(val>=0&&val<=100) cout<<val<< " "; }
};
int main( )
{ int a[] = {1,3,2,4,5,7};
const int N=sizeof(a)/sizeof(int);
vector<int> vectorA(a,a+N);
for_each(vectorA.begin(), vectorA.end(), Print);
cout<<endl;
for_each(vectorA.begin(), vectorA.end(), prt);
cout<<endl;
for_each(vectorA.begin(), vectorA.end(), cPrint( ) );
cout<<endl;
return 0;
}
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
#include <vector>
#include <algorithm>
#include <functional>
#include <string>
#include <iostream>
using namespace std;
#pragma argsused
class Grade
{public:
Grade(int id,string name,int score)
{ ID=id; Name=name; Score=score; }
int ID;
string Name;
int Score;
};
void printScore(Grade grade) //打印学生成绩
{ cout<<grade.ID<< " "
<<grade.Name<< " "
<<grade.Score<<endl;
}
//函数对象类
class gradeCompare:binary_function<Grade,Grade, bool>
{public:
bool operator () (Grade X,Grade Y) const
{ return X.Score>Y.Score; }
};
int main( )
{ vector<Grade> finalGrade;
finalGrade.push_back(Grade(1,"A",56));
finalGrade.push_back(Grade(2,"B",57));
finalGrade.push_back(Grade(3,“C”,58));
sort(finalGrade.begin(),finalGrade.end(),gradeCompare());
for_each(finalGrade.begin(),finalGrade.end(),printScore);
return 0;
}