国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[C++隨筆錄] string模擬實現(xiàn)

這篇具有很好參考價值的文章主要介紹了[C++隨筆錄] string模擬實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

放在前面:
我們實現(xiàn)string類, 并不是跟源碼一模一樣(并不是造一個新的輪子), 只是了解每個接口的實現(xiàn)過程 ? 我們以后也用的放心(比如時間復(fù)雜度, 空間復(fù)雜度等等)

基本結(jié)構(gòu)

private:
	size_t _size; // 實際長度
	size_t _capacity; // 空間
	char* _str;

習(xí)慣把不可能為負數(shù)的值的類型 定義為 size_t

天選之子

構(gòu)造函數(shù)

  1. 考慮到 無參調(diào)用和有參調(diào)用 && 只有一個參數(shù) ? 我們可以采用 全缺省的形式
  2. 傳參類型應(yīng)該為 常量字符串 ? const char* ? 一般用于初始化, 咋們給的值都是常量
  3. 缺省值初始化為 ""(空字符串) ? 常量字符串默認就會有 \0, 即 “” (空字符串) 里面就是一個 \0
  4. _size 和 _capacity 的大小不包括 \0 ? 所以, 我們初始化長度的時候, 用 strlen(str)
  5. _str要先開空間

??????

string(const char* str = "")
		:_size(strlen(str))
		,_capacity(_size)
		,_str(new char[_capacity+1])
	{
		memcpy(_str, str, _capacity+1);
	}

注意:

  1. 初始化的順序是按照 聲明的順序來的 ? 我們盡量保持 初始化和聲明的順序一致, 要不然就會出現(xiàn)問題
  2. 由于 _size 和 _capacity不包括 \0 的長度 ? 我們_str開空間的時候要多開一個, 給 \0

???為啥要用 memcpy函數(shù)? 為啥不用strcpy函數(shù)呢?

  • 1. memcpy函數(shù) 和 strcpy函數(shù)的 區(qū)別 : memcpy函數(shù)是 逐個字節(jié)進行copy的, 而strcpy是 遇到 \0就停止 copy
    2 我們標(biāo)準庫中 string類的輸出是按照 _size 來的. 即遇到下面的情況, strcpy 和 strcpy的區(qū)別就體現(xiàn)出來了??????
	// 字符串如下:
	// hello 
	// world!
	// 來做以下幾組實驗

	// 1. 庫里的string
	std::string str1 = "hello";
	str1 += "\0";
	str1 += "world!";
	cout << str1 << endl;

	// 2. 用strcpy來實現(xiàn)
	// ...
	//..

	// 3. 用memcpy來實現(xiàn)
	// ...
	// ...

*****
1. helloworld!
2. hello
3. helloworld!
*****
  1. memcpy默認是不會copy \0, 所以memcpy函數(shù)里面的長度 傳的是 _capacity+1

析構(gòu)函數(shù)

~string()
{
	delete[] _str; // 清理動態(tài)申請空間
	// 置零(置空)
	_str = nullptr;
	_size = _capacity = 0;
}

拷貝構(gòu)造函數(shù)

  1. 我們不寫構(gòu)造函數(shù), 系統(tǒng)自動生成的是一種 淺拷貝 ? 對有動態(tài)資源申請的對象來說, 會對同一塊空間析構(gòu)兩次
  2. 我們寫的是 深拷貝 ? 找一塊新的空間給 this->_str, 然后將 s的內(nèi)容 copy過去, 更新 _capacity 和 _size
String(const string& s)
{
	_str = new char[s._capacity + 1];
	memcpy(_str, s._str, s._capacity + 1);
	_capacity = s._capacity;
	_size = s._size;
}

空間

size()函數(shù)

size_t size()const
{
	return _size;
}

capacity()函數(shù)

size_t capacity()const
{
	return _capacity;
}

clear()函數(shù)

void clear()
{
	_size = 0;
	_str[_size] = '\0';
}

clear()函數(shù) 并不是用來清理空間的, 而是讓空間置空(置零)

empty()函數(shù)

bool empty()const 
{
	if(_size == 0)
		return true;
	return false;
}

reverse()函數(shù)

void reverse(size_t n)
{
	assert(n >= 0);

	// 擴容邏輯 -- 一般我們不進行縮容
	if(n > _capacity)
	{
		char* tem = new char[n+1];
		memcpy(tem._str, _str, _capacity+1);
		delete[] _str;
		_str = tem;
		_capacity = n;
	}	
}

resize()函數(shù)

void resize(size_t n, char ch = '\0')
{
	assert(n >= 0);
	
	if(n <= _size)
	{
		_size = n;
		_str[_size] = '\0';
	}
	else
	{
		reverse(n);
		for(int i = _size; i < _size+n; i++)
		{
			_str[i] = ch;
		}
		
		_size = _size + n;
		_str[_size] = '\0';
	}
}

迭代器

迭代器是屬于類的 ? 我們聲明迭代器的時候要聲明類域
??????

std::string str = "hello world";
iterator it = str.begin();

*****
error C2955: “std::iterator”: 使用 類 模板 需要 模板 參數(shù)列表
*****

但要在 string類里面,定義一種類型, 有兩種方式:

  1. typedef 一個變量
  2. 定義一個內(nèi)部類 (內(nèi)部類一般都是自定義類型)

而我們這里iterator其實就是數(shù)組_str各個下標(biāo)對應(yīng)的地址, 是一種 內(nèi)置類型 ? 所以, 我們采用typedef的方式來實現(xiàn) iterator

iterator

typedef char* iterator;

begin()函數(shù)

iterator begin()
{
	return _str;
}

end()函數(shù)

iterator end()
{
	return _str + _size;
}

const_iterator

typedef const char* const_iterator;

begin()函數(shù)

const_iterator begin()const
{
	return _str;
}

end()函數(shù)

const_iterator end()const
{
	return _str + _size;
}

push_back()函數(shù)

尾插一個字符的操作:

  1. 是否需要擴容 ? _size == _capacity

  2. 擴容邏輯:

    1. _capacity == 0 ? 傳個 4 過去擴容
    2. _capacity > 0 ? 2倍擴容
  3. _size++, _str[_size] = ‘\0’;

void push_back(const char ch)
{
	// 是否擴容
	if (_size == _capacity)
	{
		size_t newcapacity = (_capacity == 0 ? 4 : _capacity * 2);
		reverse(newcapacity);
	}

	_str[_size] = ch;
	_size++;
	_str[_size] = '\0';

}

append()函數(shù)

尾插一個字符串的操作:

  1. 是否需要擴容

  2. 擴容邏輯:
    1. _size + len <= _capacity — — 不需要擴容
    2. _size + len > _capacity — — 擴容(_size + len)

  3. _size = _size + len, _str[_size] = ‘\0’;

void append(const char* ch)
{
	size_t len = strlen(ch);

	// 是否擴容
	if (len + _size > _capacity)
	{
		reverse(len + _size);
	}

	for (size_t i = 0; i < len; i++)
	{
		_str[_size + i] = ch[i];
	}
	_size += len;
	_str[_size] = '\0';

}

operator+=

復(fù)用 push_back() 和 append()

void operator+=(const char ch)
{
	push_back(ch);

}

void operator+=(const char* ch)
{
	append(ch);

}

insert()函數(shù)

在 下標(biāo)為pos的位置插入n個字符:

  1. 是否需要擴容

  2. 擴容邏輯:

    1. _size + n <= _capacity — — 不需要擴容
    2. _size + n > _capacity — — 擴容(_size + n)
  3. 挪動數(shù)據(jù)

  4. _size = _size + n, _str[_size] = ‘\0’;

void insert(size_t pos, const char* ch)
{
	assert(pos >= 0);

	// 是否需要擴容
	size_t len = strlen(ch);
	if (_size + len > _capacity)
	{
		reverse(_size + pos);

	}

	// 挪動數(shù)據(jù)
	size_t end = _size;
	// 挪動數(shù)據(jù)時, 下標(biāo)不能小于0(即不能等于 -1)
	while (end >= pos && end != _nops)
	{
		_str[end + len] = _str[end];
		end--;
	}

	// 插入數(shù)據(jù)
	for (size_t i = 0; i < len; i++)
	{
		_str[pos + i] = ch[i];
	}

	_size = _size + len;
}
  • 對了, 這里的 _nops是我么定義的一個靜態(tài)成員變量
// 類里面的聲明
public:
	static size_t _nops;

// 類外面的初始化
size_t muyu::string::_nops = -1; // 這里的muyu是我定義的一個命名空間域

???為啥要定義一個nops? 為啥要初始化為 -1?

  • 前面, 我們有說過: 不可能為負數(shù)的, 我們定義成 size_t (無符號整數(shù))
    如果 下標(biāo)減到 -1 — ---- 由于是 size_t, 變量是不會比 -1 小的
    那么 size_t 類型如何區(qū)分開 -1 呢?
    size_t i = -1; ? i 等于 2 ^ 32 -1;
    那么 下標(biāo) 不等于 nops不就行了~~
    還有就是, 插入函數(shù) 和 刪除函數(shù)中 字符串的長度如果不寫, 就是nops

erase()函數(shù)

void erase(size_t pos, size_t n = _nops)
{
	assert(pos >= 0);

	// 是否把pos位置后面全部刪除
	if (n == _nops || pos + n >= _size)
	{
		_str[pos] = '\0';
		_size = pos;
	}
	else
	{
		for (size_t i = pos; i < pos + n; i++)
		{
			_str[i] = _str[i + n];
		}
		_size = _size - n;
	}
}

find()函數(shù)

size_t find(size_t pos = 0, const char ch )
{
	assert(pos < _size);

	for (int i = pos; i < _size; i++)
	{
		if (_str[i] == ch)
		{
			return i;
		}
	}

	return _nops;
}

size_t find(size_t pos = 0, const char* ch )
{
	assert(pos < _size);
	
	// 如果找到返回地址, 否則返回nullptr
	const char* res = strstr(_str, ch);

	if (res)
	{
		return res - _str;
	}
	else
	{
		return _nops;
	}

}

swap()函數(shù)

void swap(string& s)
{
	std::swap(_size, s._size);
	std::swap(_capacity, s._capacity);
	std::swap(_str, s._str);
}

operator[]函數(shù)

//不是&, 那就返回的是常量臨時拷貝
char& operator[](size_t n)
{
	assert(n <= _size);

	return _str[n];
}

const char& operator[](size_t n)const 
{
	assert(n <= _size);

	return _str[n];
}

operator= 函數(shù)

//string& operator=(const string& s)
//{
//	// 傳統(tǒng)寫法 -- 找一塊空間, 把s的內(nèi)容搞過去, 然后和*this交換
//	// 1. 找空間, 移內(nèi)容;  2. 釋放this的空間

//	string tem;
//	tem.reverse(s._capacity + 1);
//	memcpy(tem._str, s._str, s._capacity + 1);
//	tem._size = s._size;

//	swap(tem);

//	return *this;

//}

string& operator=(string s)
{
	swap(s);

	return *this;
}

比較

bool operator==(const string& s)
{
	// 如果_size都不相等, 那么何談相等
	return _size == s._size &&
		memcmp(_str, s._str, _size) == 0;
}

bool operator>(const string& s)
{
	// 取較小長度進行比較
	size_t size = std::min(_size, s._size);
	int ret = memcmp(_str, s._str, size);
	
	// 由于是取較小長度進行比較, 那么會出現(xiàn)如下幾種情況:
	// 1. str1 = hello, str2 = hello
	// 2. str1 = hello\0xxx, str2 = hello
	// 3. str1 = hello, str2 = hello\00xxx
	// 這幾種情況都是根據(jù)較小長度比較的結(jié)果都是 相等
	if (ret == 0)
	{
		if (_size > s._size)
			return true;
		else
			return false;
	}

	return ret > 0;

}

bool operator!=(const string& s)
{
	return !(*this == s);
}

bool operator>=(const string& s)
{
	return *this == s || *this > s;
}

bool operator<(const string& s)
{
	return !(*this >= s);
}

bool operator<=(const string& s)
{
	return !(*this > s);
}

流操作

流操作要寫在全局位置 ? cout/cin 要搶占第一個參數(shù). 若要是在類中, 第一個參數(shù)就默認是this

流插入 <<

ostream& operator<<(ostream& out, const string& s)
{
	for (auto ch : s)
	{
		out << ch;
	}

	return out;
}

流提取 >>

istream& operator>>(istream& in, string& s)
{
	// 每一次新的讀取要進行清理一下
	// 要不然就會接著讀取, 而不是覆蓋
	s.clear();

	// get()函數(shù)可以讀到每一個字符, 包括空格 和 換行
	char ch = in.get();
	// 處理前緩沖區(qū)前面的空格或者換行
	while (ch == ' ' || ch == '\n')
	{
		ch = in.get();
	}

	// in >> ch;
	char buff[128]; // buff數(shù)組的作用是: 減少開空間的次數(shù)
	int i = 0;

	while (ch != ' ' && ch != '\n')
	{
		buff[i++] = ch;
		if (i == 127)
		{
			buff[i] = '\0';
			s += buff;
			i = 0;
		}

		//in >> ch;
		ch = in.get();
	}
	
	// 如果最后 buff數(shù)組還有數(shù)據(jù), 那么就加到s中
	if (i != 0)
	{
		buff[i] = '\0';
		s += buff;
	}

	return in;
}

C接口

c_str()函數(shù)

const char* c_str()const 
{
	return _str;
}

substr()函數(shù)

string substr(size_t pos = 0, size_t n = _nops)
{
	assert(pos >= 0);
	
	// 是否需要擴容
	int len = n; // 默認是n
	if (n == _nops || pos + n >= _size)
	{
		len = _size - pos;
	}

	string tem;
	tem.reverse(len);
	//for (size_t i = pos; i < len; i++)
	//{
	//	tem[i] = _str[i + pos];
	//}

	//tem._size = len;
	//tem[_size] = '\0';

	for (size_t i = pos; i < pos + len; i++)
	{
		tem += _str[i];
	}

	return tem;
}

源碼

#pragma once

#include <string.h>
#include<assert.h>
#include<iostream>

namespace muyu
{
	class string
	{
	public:
		typedef char* iterator;
		typedef const char* const_iterator;

		// friend ostream& operator<<(ostream& out, const string& s);


		iterator begin()
		{
			return _str;
		}

		const_iterator begin()const
		{
			return _str;
		}
		
		iterator end()
		{
			return _str + _size;
		}

		const_iterator end()const
		{
			return _str + _size;
		}

		string(const char* str = "")
			:_size(strlen(str))
			,_capacity(_size)
			,_str(new char[_capacity+1])
		{
			memcpy(_str, str, _capacity+1);
		}

		string(const string& tem)
		{
			_str = new char[tem._capacity + 1];
			memcpy(_str, tem._str, tem._capacity + 1);
			_capacity = tem._capacity;
			_size = tem._size;
		}

		~string()
		{
			delete[] _str;
			_str = nullptr;
			_size = _capacity = 0;
		}

		const char* c_str()const
		{
			return _str;
		}

		void reverse(size_t n)
		{
			if (n > _capacity)
			{
				char* tem = new char[n + 1];
				memcpy(tem, _str, _capacity + 1);
				_capacity = n;
				delete[] _str;
				_str = tem;
			}
		}

		void resize(size_t n, char ch = '\0')
		{
			if (_size > n)
			{
				_str[n] = '\0';
				_size = n;
			}
			else
			{
				reverse(n); // 不管需不需要擴容,都丟給reverse. reverse內(nèi)部有判斷是否需要擴容
				for (size_t i = _size; i < n; i++)
				{
					_str[i] = ch;
				}
				_str[n] = '\0';
			}
		}

		void push_back(const char ch)
		{
			// 是否擴容
			if (_size == _capacity)
			{
				size_t newcapacity = (_capacity == 0 ? 4 : _capacity * 2);
				reverse(newcapacity);
			}

			_str[_size] = ch;
			_size++;
			_str[_size] = '\0';

		}

		void append(const char* ch)
		{
			size_t len = strlen(ch);

			// 是否擴容
			if (len + _size > _capacity)
			{
				reverse(len + _size);
			}

			for (size_t i = 0; i < len; i++)
			{
				_str[_size + i] = ch[i];
			}
			_size += len;
			_str[_size] = '\0';

		}

		void operator+=(const char ch)
		{
			push_back(ch);

		}

		void operator+=(const char* ch)
		{
			append(ch);

		}

		void insert(size_t pos, const char* ch)
		{
			assert(pos >= 0);

			// 是否需要擴容
			size_t len = strlen(ch);
			if (_size + len > _capacity)
			{
				reverse(_size + pos);

			}

			// 挪動數(shù)據(jù)
			size_t end = _size;
			// 挪動數(shù)據(jù)時, 下標(biāo)不能小于0(即不能等于 -1)
			while (end >= pos && end != _nops)
			{
				_str[end + len] = _str[end];
				end--;
			}

			// 插入數(shù)據(jù)
			for (size_t i = 0; i < len; i++)
			{
				_str[pos + i] = ch[i];
			}

			_size = _size + len;
		}

		void erase(size_t pos, size_t n = _nops)
		{
			assert(pos >= 0);

			if (n == _nops || pos + n >= _size)
			{
				_str[pos] = '\0';
				_size = pos;
			}
			else
			{
				for (size_t i = pos; i < pos + n; i++)
				{
					_str[i] = _str[i + n];
				}
				_size = _size - n;
			}
		}

		size_t size()const
		{
			return _size;
		}

		void clear()
		{
			_size = 0;
			_str[_size] = '\0';
		}

		bool empty()const
		{
			return _size > 0;
		}

		void swap(string& s)
		{
			std::swap(_size, s._size);
			std::swap(_capacity, s._capacity);
			std::swap(_str, s._str);
		}

		 //不是&, 那就返回的是常量臨時拷貝
		char& operator[](size_t n)
		{
			assert(n <= _size);

			return _str[n];
		}

		const char& operator[](size_t n)const 
		{
			assert(n <= _size);

			return _str[n];
		}

		string substr(size_t pos = 0, size_t n = _nops)
		{
			assert(pos >= 0);

			int len = n; // 默認是n
			if (n == _nops || pos + n >= _size)
			{
				len = _size - pos;
			}

			string tem;
			tem.reverse(len);
			//for (size_t i = pos; i < len; i++)
			//{
			//	tem[i] = _str[i + pos];
			//}

			//tem._size = len;
			//tem[_size] = '\0';

			for (size_t i = pos; i < pos + len; i++)
			{
				tem += _str[i];
			}

			return tem;
		}

		bool operator==(const string& s)
		{
			return _size == s._size &&
				memcmp(_str, s._str, _size) == 0;
		}

		bool operator>(const string& s)
		{
			// 取較小長度進行比較
			size_t size = std::min(_size, s._size);
			int ret = memcmp(_str, s._str, size);

			if (ret == 0)
			{
				if (_size > s._size)
					return true;
				else
					return false;
			}

			return ret > 0;

		}
		
		bool operator!=(const string& s)
		{
			return !(*this == s);
		}

		bool operator>=(const string& s)
		{
			return *this == s || *this > s;
		}

		bool operator<(const string& s)
		{
			return !(*this >= s);
		}
		
		bool operator<=(const string& s)
		{
			return !(*this > s);
		}

		size_t find(const char ch, size_t pos = 0)
		{
			assert(pos < _size);

			for (int i = pos; i < _size; i++)
			{
				if (_str[i] == ch)
				{
					return i;
				}
			}

			return _nops;
		}

		size_t find(const char* ch, size_t pos = 0)
		{
			assert(pos < _size);

			const char* res = strstr(_str, ch);

			if (res)
			{
				return res - _str;
			}
			else
			{
				return _nops;
			}

		}

		//string& operator=(const string& s)
		//{
		//	// 傳統(tǒng)寫法 -- 找一塊空間, 把s的內(nèi)容搞過去, 然后和*this交換
		//	// 1. 找空間, 移內(nèi)容;  2. 釋放this的空間

		//	//string tem;
		//	//tem.reverse(s._capacity + 1);
		//	//memcpy(tem._str, s._str, s._capacity + 1);
		//	//tem._size = s._size;

		//	//swap(tem);

		//	//return *this;

		//}

		string& operator=(string s)
		{
			swap(s);

			return *this;
		}


	private:
			size_t _size;
			size_t _capacity;
			char* _str;

	public:
			static size_t _nops;
	};


	size_t string::_nops = -1;

	ostream& operator<<(ostream& out, const string& s)
	{
		for (auto ch : s)
		{
			out << ch;
		}

		return out;
	}

	istream& operator>>(istream& in, string& s)
	{
		// 每一次新的讀取要進行清理一下
		// 要不然就會接著讀取, 而不是覆蓋
		s.clear();

		// get()函數(shù)可以讀到每一個字符, 包括空格 和 換行
		char ch = in.get();
		// 處理前緩沖區(qū)前面的空格或者換行
		while (ch == ' ' || ch == '\n')
		{
			ch = in.get();
		}

		// in >> ch;
		char buff[128]; // buff數(shù)組的作用是: 減少開空間的次數(shù)
		int i = 0;

		while (ch != ' ' && ch != '\n')
		{
			buff[i++] = ch;
			if (i == 127)
			{
				buff[i] = '\0';
				s += buff;
				i = 0;
			}

			//in >> ch;
			ch = in.get();
		}

		// 如果最后 buff數(shù)組還有數(shù)據(jù), 那么就加到s中
		if (i != 0)
		{
			buff[i] = '\0';
			s += buff;
		}

		return in;
	}

}


持志如心痛. — — 王陽明
譯:心在痛上,豈有工夫說閑話、管閑事.
文章來源地址http://www.zghlxwxcb.cn/news/detail-727558.html

到了這里,關(guān)于[C++隨筆錄] string模擬實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【C++】string模擬實現(xiàn)

    【C++】string模擬實現(xiàn)

    個人主頁??:在肯德基吃麻辣燙 本文帶你進入string的模擬實現(xiàn),對于string,是我們深入學(xué)習(xí)STL的必要途徑。 我在模擬實現(xiàn)string時,成員變量如下: 1.1 無參構(gòu)造(默認構(gòu)造) 構(gòu)造時不進行任何初始化,則默認為空字符串 比如: bit::sring s1; 1.2 普通構(gòu)造 思路: 1.先新申請一塊空

    2024年02月16日
    瀏覽(18)
  • string類的模擬實現(xiàn)

    string類的模擬實現(xiàn)

    上一篇博客我們對string類函數(shù)進行了講解,今天我們就對string類進行模擬實現(xiàn),以便于大家更加深入地了解string類函數(shù)的應(yīng)用 由于C++的庫里面本身就有一個string類,所以我們?yōu)榱瞬蛔尵幾g器混淆視聽,我們可以首先將我們自己模擬實現(xiàn)的string類放入一個我們自己定義的命名空

    2024年01月21日
    瀏覽(25)
  • C++——string模擬實現(xiàn)

    C++——string模擬實現(xiàn)

    前言:上篇文章我們對string類及其常用的接口方法的使用進行了分享,這篇文章將著重進行對這些常用的接口方法的內(nèi)部細節(jié)進行分享和模擬實現(xiàn)。 目錄 一.基礎(chǔ)框架 二.遍歷字符串 1.[]運算符重載 2.迭代器 3.范圍for 三.常用方法 1.增加 2.刪除 3.調(diào)整 4.交換 5.查找 6.截取 7.比較

    2024年03月12日
    瀏覽(20)
  • string模擬實現(xiàn):

    string模擬實現(xiàn):

    上一篇博客,我們對String類有了一個基本的認識,本篇博客我們來從0~1去模擬實現(xiàn)一個String類,當(dāng)然我們實現(xiàn)的都是一些常用的接口。 ?我們這里定義了一個string類型,然后STL標(biāo)準庫里面也有string,兩個名字一樣我們分不清楚怎么辦呢? 為了跟庫的string區(qū)分開,我們可以定

    2024年02月14日
    瀏覽(13)
  • string模擬實現(xiàn)

    string模擬實現(xiàn)

    1、構(gòu)造函數(shù),析構(gòu)函數(shù) 2、遍歷,size(),operator[],迭代器iterator 3、增刪查改 push_back? ?append(串)? ?插入前需要檢查容量,reserve()? ?再重載+= insert(挪動時,size_t pos小心死循環(huán)下標(biāo)為0,可以引入npos多一步判斷)? ? erase? find? substr? ? ?關(guān)系運算符重載 4、流插入、流提取

    2024年02月13日
    瀏覽(14)
  • string的模擬實現(xiàn)

    2024年04月12日
    瀏覽(12)
  • 操作系統(tǒng)進程調(diào)度算法(c語言模擬實現(xiàn))

    操作系統(tǒng)進程調(diào)度算法(c語言模擬實現(xiàn))

    ????????前言: 本文旨在分享如何使用c語言對操作系統(tǒng)中的部分進程調(diào)度算法進行模擬實現(xiàn),以及算法描述的講解, 完整代碼放在文章末尾,歡迎大家自行拷貝調(diào)用 目錄 常見的調(diào)度算法 數(shù)據(jù)結(jié)構(gòu) 先來先服務(wù)調(diào)度算法 算法模擬思路: 算法模擬:? 最短作業(yè)優(yōu)先調(diào)度算法

    2024年02月06日
    瀏覽(26)
  • 【操作系統(tǒng)原理實驗】銀行家算法模擬實現(xiàn)

    【操作系統(tǒng)原理實驗】銀行家算法模擬實現(xiàn)

    選擇一種高級語言如C/C++等,編寫一個銀行家算法的模擬實現(xiàn)程序。1) 設(shè)計相關(guān)數(shù)據(jù)結(jié)構(gòu);2) 實現(xiàn)系統(tǒng)資源狀態(tài)查看、資源請求的輸入等模塊;3) 實現(xiàn)資源的預(yù)分配及確認或回滾程序;4) 實現(xiàn)系統(tǒng)狀態(tài)安全檢查程序;5) 組裝各模塊成一個完整的模擬系統(tǒng)。 (1)設(shè)計思想: 1、

    2024年02月01日
    瀏覽(25)
  • 【C++】——string的模擬實現(xiàn)

    【C++】——string的模擬實現(xiàn)

    前言: 在之前的學(xué)習(xí)中,我們已經(jīng)對string類進行了簡單的介紹,大家只要能夠正常使用即可。但是在面試中,面試官總喜歡讓學(xué)生自己 來模擬實現(xiàn)string類,最主要是實現(xiàn)string類的構(gòu)造、拷貝構(gòu)造、賦值運算符重載以及析構(gòu)函數(shù)。因此,接下來我將帶領(lǐng)大家手動模擬實現(xiàn)一下

    2024年02月05日
    瀏覽(17)
  • 【C++】string類模擬實現(xiàn)

    【C++】string類模擬實現(xiàn)

    ?? 作者簡介:一名在后端領(lǐng)域?qū)W習(xí),并渴望能夠?qū)W有所成的追夢人。 ?? 個人主頁:不 良 ?? 系列專欄:??C++ ???Linux ?? 學(xué)習(xí)格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學(xué)習(xí)的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與諸君一同

    2024年02月15日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包