bingc++(STL(stackqueue)IO流)

Posted 鸟随二月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bingc++(STL(stackqueue)IO流)相关的知识,希望对你有一定的参考价值。

上一篇

目录标题

stack和queue

  • 为什么没有迭代器?因为两者不需要迭代

模拟stack

vector模拟stack

模拟queue

list模拟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,然后再拷贝过来)

迭代器

模拟

模拟stack
模拟queue

为什么选择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和容器适配器的介绍

适配器