首页 > 系统相关 >又臭又长的字符串处理(简易内存池)

又臭又长的字符串处理(简易内存池)

时间:2022-11-13 00:24:21浏览次数:33  
标签:cout int 内存 str address 字符串 又臭又长 size

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int max = 100;
//分配函数
void alloc(vector<vector<int>> &address,int size) {
	if (size > 100||size==0) {
		cout << "error" << endl;
		return;
	}
//第一种情况,第一次申请内存,直接输出0坐标,将第一段的地址终点设置为size-1
	if (address.size() == 0) {
		address.push_back({ 1,0,size-1 });
		cout << '0'<<endl;
		return;
	}
//第二种情况,向已释放的内存块中分配内存。也就是对地址数组内的内存块搜索,找到未使用的足够大小的内存块。
	for (auto &i : address) {
		if (i[0] != 1&& i[2] - i[1] + 1 >= size) {
				i[0] = 1;
				i[2] += size ;
				cout << i[1] << endl;
				return;
		}
		else continue;
	}
//第三种情况,重新从地址块最后面开辟一块地址块,需要考虑内存池的最大值。
	int end = address.back()[2]+1;
	if (end  > 99 || end + size - 1 > 99) {
		cout << "error" << endl;
		return;
	}
	cout << end  << endl;
	address.push_back({ 1,end ,end + size-1 });
}
//释放函数
void rel(vector<vector<int>> &address,int begin) {
//对空的内存池释放	
if (address.size() == 0) {
		cout << "error" << endl;
		return;
	}
//寻找首地址相同的内存块
	for (auto &i : address) {
		if (i[0] == 1) {
			if (i[1] == begin) {
				if (i[0] == -1 || i[0] == 0) {
					cout << "error" << endl;
					return;
				}
				else {
					i[0] = -1;
				}
			}
		}
		else if (i[0] == -1) {
			cout << "error" << endl;
		}
		else
			continue;
	}
}
int main() {
	int n = 0;
	cin >> n; //读取n
	string temp;
	getline(cin, temp);//换行
	vector<pair<int,int>> op;//二元的操作组,first只有1和0的值,1代表申请内存,0代表释放内存,second代表操作的参数。
	/*7
REQUEST=10
REQUEST=20
RELEASE=0
RELEASE=20
RELEASE=0
REQUEST=20
REQUEST=10
	*/
	while (n--) {
		string str;
		getline(cin, str);
		int p = str.size()-1;
		int num = 0;
		int flag = 1;
		while (str[p] >= '0' && str[p]<='9') {
			num += str[p] - '0';
			num *= 10;
			--p;
		}
//因为输入是格式化的,所以只要判断字符串中第3个元素就可以区分2种操作。
		if (str[2] == 'L') {
			flag = 0;
		}
		op.push_back({flag,num});
	}
	vector<vector<int>> address;
//地址组每个元素的每一列代表的含义:第一列是状态,有0(未使用),-1(已释放),1(在使用);第二列是每块内存的起始地址,第三列是每块内存的终点坐标。
//执行操作。
	for (auto &i : op) {
		if (i.first) {
			alloc(address,i.second);
		}
		else {
			rel(address,i.second);
		}
	}
	return 0;
}

标签:cout,int,内存,str,address,字符串,又臭又长,size
From: https://www.cnblogs.com/chunbai11/p/16885204.html

相关文章

  • Redis字符串(String)
    String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。常用命令set<key><value>添加键值对get<key>查询对应键值append<......
  • 来自学长的字符串2
    我们抬头仰望同一片星空,在万家灯火熄灭的时候……本来打算先改考试题在再finish,结果鹤了一下午+半个晚上也没鹤对,鹤的T2还被卡了却依然不知道为什么那个贪心是假的……......
  • Python字符串操作
    Python字符串操作1.*字符串的常用操作1.*.&访问字符串中的值Python访问子字符串变量,可以使用方括号来截取字符串。与列表的索引一样,字符串索引从0开始。字符串的索引......
  • Python3.8多进程共享内存之Numpy数组
    在利用python处理数据的时候,想要充分发挥CPU的算力,可以选择利用多进程来实现。如果子进程内存占用较大的话,往往很难多开进程,如果不涉及对内存的写入操作,那么多个子进程共享......
  • 深入理解Java虚拟机——自动内存管理
    目录内存结构总览程序计数器(寄存器)各种码之间的关系程序计数器的特点虚拟机栈虚拟机栈溢出本地方法栈堆Heap堆内存溢出堆内存诊断方法区永久代和元空间对方法区的实现方法......
  • 记录一次保持原电压实现内存超频
    最近身边朋友开始换新型号的电脑,内存也都换成了DDR5的,看着自己手上的几年前的电脑还用这ddr4的内存,想着要不也试试把内存频率调调,也搞个超频试试。 由于最初的想法就是......
  • 判断是否为回文字符串, StringBuffer对象的reverse()方法,返回值toString()
      import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可    ......
  • 内存管理
    得分点段页式内存管理方式标准回答Linux操作系统是采用段页式内存管理方式:页式存储管理能有效地提高内存利用率(解决内存碎片),而分段存储管理能反映程序的逻辑结构并有......
  • [其他] 字节byte不总是内存中的最小寻址单位(极少情况下不是)
    结论:在不同的机器架构上,甚至在特定的操作系统上,最小的内存寻址单位都可能不同,但是在大部分情况下字节就是最小的内存寻址单位,c和c++标准都有明确的要求。另外,物理内存是不存......
  • 第四十四章 在CSP应用程序中本地化文本 - 显示本地化字符串的其他选项
    目录第四十四章在CSP应用程序中本地化文本-显示本地化字符串的其他选项显示本地化字符串的其他选项%response.GetTextMethodFormatTextMethod$$$FormatTextMacrosMat......