bingc++(STL(stackqueue)IO流)
Posted 鸟随二月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bingc++(STL(stackqueue)IO流)相关的知识,希望对你有一定的参考价值。
目录标题
stack和queue
- 为什么没有迭代器?因为两者不需要迭代
模拟stack
模拟queue
优先级队列priority_queue
如果在优先级队列中插入自定义对象,需要对其进行>或<进行重载
使用
当传入的元素是地址时
模拟priority_queue
priority_queue<int,vector<int>, greater<int>> q;
//第三个参数默认是less<int>二者都在<functional>中
sort的使用
#include <vector>
#include <algorithm>
#include <functional>
int main()
int array[] = 4,2,0,9,1,7,3,8,6,5;
// 默认按照小于方式进行比较
sort(array, array + sizeof(array) / sizeof(array[0]));
vector<int> v 4, 2, 0, 9, 1, 7, 3, 8, 6, 5 ;
sort(v.begin(), v.end(), greater<int>());
return 0;
deque双端队列
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,
结构图解:
deque如果需要扩容:对map进行扩容----开辟新空间拷贝元素释放旧空间
注意:此处的拷贝并不是将deque中存储实际元素拷贝走,实际拷贝的是
map指向的空间中保存的每段空间的首地址
优点:头插和头删效率高—>0(1),扩容时候效率高
缺陷:代码实现复杂,遍历操作复杂以及效率低,sort代码低(可以先拷贝到vector,然后再拷贝过来)
迭代器
模拟
为什么选择deque作为stack和queue的底层默认容器
stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以; queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:
1.stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。2.在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。
结合了deque的优点,而完美的避开了其缺陷。
- 总结重点
stack:用deque而不使用vector
1.当stack中元素存储到一定程度就需要扩容
stack和queue不需要遍历
deque扩容比vector的扩容效率高—因为deque不需要搬移元素2.栈不需要遍历,deque的劣势就规避
queue: 用deque而不使用list
1.deque中不需要存储一些额外的内容list:链表—next|prev
2.deque是分段连续的,缓存效率高
3.队列不需要比遍历,deque的劣势就规避
总结
IO注意
标准IO流
接受一行字符
string words;
// cin >> words; // cin遇到空白字符就不往后接收了 如果一行有多个字符串
getline(cin,words);
// IO类型的oj----都需要使用循环输入
// 1. 输入:只有一个整形数字
void TestInput()
int iniput;
while (cin >> iniput)
// ...
// 2. 输入:一行有2个整形数据
void TestInput2()
int num1, num2;
while (cin >> num1 >> num2)
// ....
// 3. 输入:第一行n 表示n个元素 第二个:具体的n个元素
#include <vector>
void TestInput3()
size_t n;
while (cin >> n)
vector<int> v(n);
for (size_t i = 0; i < n; ++i)
cin >> v[i];
void TestInput4()
size_t n;
while (cin >> n)
vector<int> v;
int data;
for (size_t i = 0; i < n; ++i)
cin >> data;
v.push_back(data);
// 4. 输入:每个用例只是一个字符串---字符串中没有空白字符
#include <string>
void TestInput5()
string str;
while (cin >> str)
// ...
// 5. 输入:字符串中有空白字符
#include <string>
void TestInput6()
string str;
while (getline(cin, str))//getline返回值cin
// ...
// 找一下原因:cin可以作为是否继续的条件
while (cin)
文件IO流
stringstream
- 数据转字符串
int main()
int a;
cin >> a;
char str[32] = 0 ;
//_itoa(a, str, 10);
sprintf(str, "%d", a);
return 0;
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
stringstream
用途:
- 数值转字符串
- 字符串拼接
代码
以上是关于bingc++(STL(stackqueue)IO流)的主要内容,如果未能解决你的问题,请参考以下文章
bingc++模板STL(stringvectorlist)
小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map
小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map
C++STL之stackqueue的使用和模拟实现+优先级队列(附仿函数)+容器适配器详解
[C/C++]详解STL容器3--stackqueue和priority_queue的功能和模拟实现,deque和容器适配器的介绍