1.string容器
C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件string。
String和c风格字符串对比:
-
Char是一个指针,String是一个类, string封装了char,管理这个字符串,是一个char*型的容器。
-
String封装了很多实用的成员方法, 例如查找find,拷贝copy,删除delete 替换replace,插入insert。
-
不用考虑内存释放和越界, string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
2.vector容器
vector是将元素置于一个动态数组中加以管理的容器。
vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。
vector尾部添加或移除元素非常快速,但是在中部或头部插入元素或移除元素比较费时。
vector采用模板类实现,vector对象的默认构造形式 vector< T > vect
3.deque容器
deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。
使用deque容器之前必须加上deque头文件:#include < deuqe >;
deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std;
4.代码实现
//评委打分案例
//创建5个选手(姓名 得分),10个评委对5个选手进行打分
//打分规则:去掉最高分 去掉最低分 取出平均分
//按得分对5个选手进行排名
#include <iostream>
#include <string>
#include <vector>
#include <deque>
//算法头文件,demo需要用到排序算法
#include <algorithm>
using namespace std;
//创建一个选手类
class Player
{
public:
Player(string name,int sorce) {
this->mname=name;
this->msorce=sorce;
}
Player(){}
public:
//使用string 代替c风格字符串
string mname;
int msorce;
};
//创建选手
//把选手存放在一个vector容器中,方便管理
void Create_Player(vector<Player>& v) {
//先定义一个字符串
string nameseed="ABCDE";
for(int i=0;i<5;++i) {
Player p;
p.mname="选手";
//选手名字用string类的拼接完成
p.mname+=nameseed[i];
p.msorce=0;
//把选手这个实体存放进 vector中
v.push_back(p);
}
}
//一个测试函数,查看算法sort的排序时从小到大还是从大到小
void PrintSorce(int val) {
cout<<val<<" ";
}
//进行打分
void Set_Sorce(vector<Player>& v) {
//使用迭代器方式,遍历vector中的选手
for(vector<Player>::iterator it=v.begin();it!=v.end();++it) {
//对当前学生进行打分
//把数据存储在这种双向开口的容器中
deque<int> dsorce;
//给选手进行10次打分
for(int i=0;i<10;++i) {
//分数从60~~100
int sorce=rand()%41+60;
//把得到的分数存进容器
dsorce.push_back(sorce);
}
//使用sort算法对分数进行排序,依然使用迭代器
sort(dsorce.begin(),dsorce.end());
//for_each(dsorce.begin(),dsorce.end(),PrintSorce);
//去除最高分和最低分
//容器提供的方法
dsorce.pop_front();
dsorce.pop_back();
//求平均分
int totalsorce=0;
for(deque<int>::iterator dit=dsorce.begin();dit!=dsorce.end();++dit) {
totalsorce+=(*dit);
}
int avgsorce=totalsorce/dsorce.size();
//放进去
(*it).msorce=avgsorce;
}
}
//排序规则
bool mycompare(const Player& p1,const Player& p2) {
return p1.msorce>p2.msorce;
}
//得到排名
void Print_Rank(vector<Player>& v) {
sort(v.begin(),v.end(),mycompare);
//打印
for(vector<Player>::iterator it=v.begin();it!=v.end();++it) {
cout<<"姓名:"<<(*it).mname<<"得分:"<<(*it).msorce<<endl;
}
}
int main()
{
//创建这个用来存放选手的容器
vector<Player> vplist;
//创建选手
Create_Player(vplist);
//打分
Set_Sorce(vplist);
//打分以后排序
Print_Rank(vplist);
return 0;
}