网站排名怎么做 site,中国联通网站建设与维护,wordpress怎么修改模板,html5网站正在建设中本专栏记录C学习过程包括C基础以及数据结构和算法#xff0c;其中第一部分计划时间一个月#xff0c;主要跟着黑马视频教程#xff0c;学习路线如下#xff0c;不定时更新#xff0c;欢迎关注。 当前章节处于#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战… 本专栏记录C学习过程包括C基础以及数据结构和算法其中第一部分计划时间一个月主要跟着黑马视频教程学习路线如下不定时更新欢迎关注。 当前章节处于 ---------第1阶段-C基础入门 ---------第2阶段实战-通讯录管理系统 ---------第3阶段-C核心编程 ---------第4阶段实战-基于多态的企业职工系统 第5阶段-C提高编程 ---------第6阶段实战-基于STL泛化编程的演讲比赛 ---------第7阶段-C实战项目机房预约管理系统 文章目录 一、deque容器1.1 deque容器基本概念1.2 deque构造函数1.3 deque赋值操作1.4 deque大小操作1.5 deque 插入和删除1.6 deque 数据存取1.7 deque 排序 二、 stack容器2.1 stack 基本概念2.2 stack 常用接口 三、 queue 容器3.1 queue 基本概念3.2 queue 常用接口 一、deque容器
1.1 deque容器基本概念
功能
双端数组可以对头端进行插入删除操作
deque与vector区别
vector对于头部的插入删除效率低数据量越大效率越低deque相对而言对头部的插入删除速度回比vector快vector访问元素时的速度会比deque快,这和两者内部实现有关
deque内部工作原理:
deque内部有个中控器维护每段缓冲区中的内容缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址使得使用deque时像一片连续的内存空间
deque容器的迭代器也是支持随机访问的
1.2 deque构造函数
功能描述
deque容器构造
函数原型
dequeT deqT; //默认构造形式deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。deque(n, elem); //构造函数将n个elem拷贝给本身。deque(const deque deq); //拷贝构造函数
示例
#include dequevoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}
//deque构造
void test01() {dequeint d1; //无参构造函数for (int i 0; i 10; i){d1.push_back(i);}printDeque(d1);dequeint d2(d1.begin(),d1.end());printDeque(d2);dequeintd3(10,100);printDeque(d3);dequeintd4 d3;printDeque(d4);
}int main() {test01();system(pause);return 0;
}0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .总结 deque容器和vector容器的构造方式几乎一致灵活使用即可
1.3 deque赋值操作
功能描述
给deque容器进行赋值
函数原型 deque operator(const deque deq); //重载等号操作符 assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。 assign(n, elem); //将n个elem拷贝赋值给本身。
示例
#include dequevoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}
//赋值操作
void test01()
{dequeint d1;for (int i 0; i 10; i){d1.push_back(i);}printDeque(d1);dequeintd2;d2 d1;printDeque(d2);dequeintd3;d3.assign(d1.begin(), d1.end());printDeque(d3);dequeintd4;d4.assign(10, 100);printDeque(d4);}int main() {test01();system(pause);return 0;
}
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .总结deque赋值操作也与vector相同需熟练掌握
1.4 deque大小操作
功能描述
对deque容器的大小进行操作
函数原型 deque.empty(); //判断容器是否为空 deque.size(); //返回容器中元素的个数 deque.resize(num); //重新指定容器的长度为num,若容器变长则以默认值填充新位置。 //如果容器变短则末尾超出容器长度的元素被删除。 deque.resize(num, elem); //重新指定容器的长度为num,若容器变长则以elem值填充新位置。 //如果容器变短则末尾超出容器长度的元素被删除。
示例
#include dequevoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}//大小操作
void test01()
{dequeint d1;for (int i 0; i 10; i){d1.push_back(i);}printDeque(d1);//判断容器是否为空if (d1.empty()) {cout d1为空! endl;}else {cout d1不为空! endl;//统计大小cout d1的大小为 d1.size() endl;}//重新指定大小d1.resize(15, 1);printDeque(d1);d1.resize(5);printDeque(d1);
}int main() {test01();system(pause);return 0;
}
0 1 2 3 4 5 6 7 8 9
d1不为空!
d1的大小为10
0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
0 1 2 3 4
请按任意键继续. . .总结
deque没有容量的概念判断是否为空 — empty返回元素个数 — size重新指定个数 — resize
1.5 deque 插入和删除
功能描述
向deque容器中插入和删除数据
函数原型
两端插入操作
push_back(elem); //在容器尾部添加一个数据push_front(elem); //在容器头部插入一个数据pop_back(); //删除容器最后一个数据pop_front(); //删除容器第一个数据
指定位置操作 insert(pos,elem); //在pos位置插入一个elem元素的拷贝返回新数据的位置。 insert(pos,n,elem); //在pos位置插入n个elem数据无返回值。 insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据无返回值。 clear(); //清空容器的所有数据 erase(beg,end); //删除[beg,end)区间的数据返回下一个数据的位置。 erase(pos); //删除pos位置的数据返回下一个数据的位置。
示例
#include dequevoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}
//两端操作
void test01()
{dequeint d;//尾插d.push_back(10);d.push_back(20);//头插d.push_front(100);d.push_front(200);printDeque(d);//尾删d.pop_back();//头删d.pop_front();printDeque(d);
}//插入
void test02()
{dequeint d;d.push_back(10);d.push_back(20);d.push_front(100);d.push_front(200);printDeque(d);d.insert(d.begin(), 1000);printDeque(d);d.insert(d.begin(), 2,10000);printDeque(d);dequeintd2;d2.push_back(1);d2.push_back(2);d2.push_back(3);d.insert(d.begin(), d2.begin(), d2.end());printDeque(d);}//删除
void test03()
{dequeint d;d.push_back(10);d.push_back(20);d.push_front(100);d.push_front(200);printDeque(d);d.erase(d.begin());printDeque(d);d.erase(d.begin(), d.end());d.clear();printDeque(d);
}int main() {//test01();//test02();test03();system(pause);return 0;
}
200 100 10 20
100 10 20请按任意键继续. . .总结
插入和删除提供的位置是迭代器尾插 — push_back尾删 — pop_back头插 — push_front头删 — pop_front
1.6 deque 数据存取
功能描述
对deque 中的数据的存取操作
函数原型
at(int idx); //返回索引idx所指的数据operator[]; //返回索引idx所指的数据front(); //返回容器中第一个数据元素back(); //返回容器中最后一个数据元素
示例
#include dequevoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}//数据存取
void test01()
{dequeint d;d.push_back(10);d.push_back(20);d.push_front(100);d.push_front(200);for (int i 0; i d.size(); i) {cout d[i] ;}cout endl;for (int i 0; i d.size(); i) {cout d.at(i) ;}cout endl;cout front: d.front() endl;cout back: d.back() endl;}int main() {test01();system(pause);return 0;
}
200 100 10 20
200 100 10 20
front:200
back:20
请按任意键继续. . .总结
除了用迭代器获取deque容器中元素[ ]和at也可以front返回容器第一个元素back返回容器最后一个元素
1.7 deque 排序
功能描述
利用算法实现对deque容器进行排序
算法
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序
示例
#include deque
#include algorithmvoid printDeque(const dequeint d)
{for (dequeint::const_iterator it d.begin(); it ! d.end(); it) {cout *it ;}cout endl;
}void test01()
{dequeint d;d.push_back(10);d.push_back(20);d.push_front(100);d.push_front(200);printDeque(d);sort(d.begin(), d.end());printDeque(d);}int main() {test01();system(pause);return 0;
}总结sort算法非常实用使用时包含头文件 algorithm即可
200 100 10 20
10 20 100 200
请按任意键继续. . .实战案例-评委打分
有5名选手选手ABCDE10个评委分别对每一名选手打分去除最高分去除评委中最低分取平均分。 实现步骤
创建五名选手放到vector中遍历vector容器取出来每一个选手执行for循环可以把10个评分打分存到deque容器中sort算法对deque容器中分数排序去除最高和最低分deque容器遍历一遍累加总分获取平均分
#include iostream
using namespace std;
#includevector
#includedeque
#includealgorithm
// 创建选手类
class Person {
public:Person(string name,int score) {this-m_name name;this-aver_score score;}string m_name;int aver_score 0;
};
void createPerson(vectorPersonv) {string nameSeed ABCDE;for (int i 0; i nameSeed.size(); i) {string name 选手;name nameSeed[i];int score 0;Person p(name, score);v.push_back(p); // 把创建的对象放入容器中}
}
// 添加分
void setScore(vectorPerson v) {for (vectorPerson::iterator it v.begin(); it ! v.end(); it) {// 评委打分存在deque容器中排序后去除最低分和最高分dequeint d;for (int i 0; i 10; i) {int score rand() % 41 60; // 60-100d.push_back(score);}sort(d.begin(), d.end());// 去除最高分和最低分d.pop_back();d.pop_front();// 计算平均分float average 0;for (int j 0; j 8; j) {average d[j];}(*it).aver_score (average / 8);}
}
// 打印信息
void showdata(vectorPerson v) {for (vectorPerson::iterator it v.begin(); it ! v.end(); it) {cout 姓名 (*it).m_name 平均分 (*it).aver_score endl;}
}
int main() {//随机数种子srand((unsigned int)time(NULL));//1、创建5名选手vectorPersonv; //存放选手容器createPerson(v);//2、给5名选手打分setScore(v);//3、显示最后得分showdata(v);system(pause);return 0;}
姓名选手A 平均分78
姓名选手B 平均分76
姓名选手C 平均分79
姓名选手D 平均分79
姓名选手E 平均分76
请按任意键继续. . .总结 选取不同的容器操作数据可以提升代码的效率
二、 stack容器
2.1 stack 基本概念
概念stack是一种先进后出(First In Last Out,FILO)的数据结构它只有一个出口
栈中只有顶端的元素才可以被外界使用因此栈不允许有遍历行为
栈中进入数据称为 — 入栈 push
栈中弹出数据称为 — 出栈 pop
2.2 stack 常用接口
功能描述栈容器常用的对外接口
构造函数
stackT stk; //stack采用模板类实现 stack对象的默认构造形式stack(const stack stk); //拷贝构造函数
赋值操作
stack operator(const stack stk); //重载等号操作符
数据存取
push(elem); //向栈顶添加元素pop(); //从栈顶移除第一个元素top(); //返回栈顶元素
大小操作
empty(); //判断堆栈是否为空size(); //返回栈的大小
示例
#include stack//栈容器常用接口
void test01()
{//创建栈容器 栈容器必须符合先进后出stackint s;//向栈中添加元素叫做 压栈 入栈s.push(10);s.push(20);s.push(30);while (!s.empty()) {//输出栈顶元素cout 栈顶元素为 s.top() endl;//弹出栈顶元素s.pop();}cout 栈的大小为 s.size() endl;}int main() {test01();system(pause);return 0;
}
栈顶元素为 30
栈顶元素为 20
栈顶元素为 10
栈的大小为0
请按任意键继续. . .总结
入栈 — push出栈 — pop返回栈顶 — top判断栈是否为空 — empty返回栈大小 — size
三、 queue 容器
3.1 queue 基本概念
概念Queue是一种先进先出(First In First Out,FIFO)的数据结构它有两个出口
队列容器允许从一端新增元素从另一端移除元素
队列中只有队头和队尾才可以被外界使用因此队列不允许有遍历行为
队列中进数据称为 — 入队 push
队列中出数据称为 — 出队 pop
3.2 queue 常用接口
功能描述栈容器常用的对外接口
构造函数
queueT que; //queue采用模板类实现queue对象的默认构造形式queue(const queue que); //拷贝构造函数
赋值操作
queue operator(const queue que); //重载等号操作符
数据存取
push(elem); //往队尾添加元素pop(); //从队头移除第一个元素back(); //返回最后一个元素front(); //返回第一个元素
大小操作
empty(); //判断堆栈是否为空size(); //返回栈的大小
示例
#include queue
#include string
class Person
{
public:Person(string name, int age){this-m_Name name;this-m_Age age;}string m_Name;int m_Age;
};void test01() {//创建队列queuePerson q;//准备数据Person p1(唐僧, 30);Person p2(孙悟空, 1000);Person p3(猪八戒, 900);Person p4(沙僧, 800);//向队列中添加元素 入队操作q.push(p1);q.push(p2);q.push(p3);q.push(p4);//队列不提供迭代器更不支持随机访问 while (!q.empty()) {//输出队头元素cout 队头元素-- 姓名 q.front().m_Name 年龄 q.front().m_Age endl;cout 队尾元素-- 姓名 q.back().m_Name 年龄 q.back().m_Age endl;cout endl;//弹出队头元素q.pop();}cout 队列大小为 q.size() endl;
}int main() {test01();system(pause);return 0;
}
总结
入队 — push出队 — pop返回队头元素 — front返回队尾元素 — back判断队是否为空 — empty返回队列大小 — size