上回我们完成了string类的模拟实现,不过之前写的传统写法本篇,我们将要对其进行一些改进,写成参考的是现代写法,这样写可以提高可读性。

上回我们写好的string类

//string.h

#pragma once#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include
#include
using namespace std;

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

		iterator begin();
		iterator end();

		const_iterator begin() const;
		const_iterator end() const;

		//string();
		string(const char* str = "");
		string(const string& s);
		string& operator=(const string& s);
		~string();

		const char* c_str() const;

		size_t size() const;
		char& operator[](size_t pos);
		const char& operator[](size_t pos) const;

		void reserve(size_t n);

		void push_back(char ch);
		void append(const char* str);

		string& operator+=(char ch);
		string& operator+=(const char *str);
		 

		void insert(size_t pos, char ch);
		void insert(size_t pos, const char* str);
		void erase(size_t pos = 0, size_t len = npos);

		size_t find(char ch, size_t pos = 0);
		size_t find(const char* str, size_t pos = 0);

		void swap(string& s);
		string substr(size_t pos = 0, size_t len = npos);

		bool operator(const string& s) const;
		bool operator=(const string& s) const;
		bool operator==(const string& s) const;
		bool operator!=(const string& s) const;
		void clear();
	private:
		// char _buff[16];
		char* _str;

		size_t _size;
		size_t _capacity;

		//  
		//const static size_t npos = -1;

		// ֧
		//const static double N = 2.2;

		const static size_t npos;
	};

	istream& operator>> (istream& is, string& str);
	ostream& operator<< (ostream& os, const string& str);
}

//string.cpp

#include"string.h"
namespace STring
{
	const size_t string::npos = -1;

	 string::iterator string::begin()
	{
		return _str;
	}
	string::const_iterator string::begin() const
	{
		return _str;
	}
	string::iterator string::end()
	{
		return _str + _size;
	}
	string::const_iterator string::end() const
	{
		return _str+_size;
	}
	string:: string(const char* str)
		:_size(strlen(str))
	{
		_str = new char[_size+1];
		_capacity = _size+1;
		strcpy(_str, str);
	}
	string::string(const string& s)
	{
		_str = new char[s._capacity];
		strcpy(_str, s._str);
		_size = s._size;
		_capacity = s._capacity;
	}
	string::~string()
	{
		delete[] _str;
		_str = nullptr;
		_size = _capacity = 0;
	}
	const char* string::c_str() const
	{
		return _str;
	}
	size_t string :: size() const
	{
		return _size;
	}
	void string::reserve(size_t n)
	{
		if (n > _capacity)
		{
			char* tmp = new char[n + 1];
			strcpy(tmp, _str);
			delete[] _str;
			_str = tmp;
			_capacity = n;
		}
	}
	void string::push_back(char ch)
	{
		if (_size == _capacity)
		{
			size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
			reserve(newcapacity);
		}
		_str[_size] = ch;
		_str[_size + 1] = '
#include"string.h"
namespace STring
{
const size_t string::npos = -1;
string::iterator string::begin()
{
return _str;
}
string::const_iterator string::begin() const
{
return _str;
}
string::iterator string::end()
{
return _str + _size;
}
string::const_iterator string::end() const
{
return _str+_size;
}
string:: string(const char* str)
:_size(strlen(str))
{
_str = new char[_size+1];
_capacity = _size+1;
strcpy(_str, str);
}
string::string(const string& s)
{
_str = new char[s._capacity];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
}
string::~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
const char* string::c_str() const
{
return _str;
}
size_t string :: size() const
{
return _size;
}
void string::reserve(size_t n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = n;
}
}
void string::push_back(char ch)
{
if (_size == _capacity)
{
size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
reserve(newcapacity);
}
_str[_size] = ch;
_str[_size + 1] = '\0';
++_size;
}
void string::append(const char* str)
{
size_t len = strlen(str);
if (_size + len > _capacity)
{
reserve(_size + len);
}
strcpy(_str + _size, _str);
_size += len;
insert(_size, _str);
}
void string::insert(size_t pos, char ch)
{
assert(pos  pos)
{
_str[end] = _str[end - 1] + 1;
--end;
}
_str[pos] = ch;
++_size;
}
void string::insert(size_t pos, const char* str)
{
assert(pos  _capacity)
{
reserve(_capacity+len);
}
size_t end = _size + len;
while (end > pos+len+1)
{
_str[end] = _str[end - len];
--end;
}
memcpy(_str+pos,str,len);
_size += len;
}
void string::erase(size_t pos, size_t len)
{
assert(pos = _size - pos)
{
_str[pos] = '\0';
_size = len;
}
else
{
strcpy(_str + pos, _str + pos + len);
_size = len;
}
}
size_t string::find(char ch, size_t pos)
{
for (size_t i = pos; i  _size - pos)
{
string sub(_str + pos);
return sub;
}
else
{
string sub;
sub.reserve(len);
for (size_t i = 0; i < len; i++)
{
sub += _str[i + pos];
}
return sub;
}
}
string& string:: operator=(const string& s)
{
if (this != &s)
{
char* tmp = new char[s._capacity];
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
char& string::operator[](size_t pos)
{
if (pos < _size)
return _str[pos];
}
const char& string::operator[](size_t pos) const
{
if (pos < _size)
return _str[pos];
}
string& string::operator+=(char ch)
{
push_back(ch);
return *this;
}
string& string::operator+=(const char* str)
{
append(str);
return *this;
}
bool string::operator<(const string& s) const
{
return strcmp(_str, s._str) (const string& s) const
{
return !(*this <= s);
}
bool string::operator<=(const string& s) const
{
return *this =(const string& s) const
{
return !(*this > (istream& is, string& str)
{
str.clear();
char ch = is.get();
while (ch != ' ' && ch != '
')
{
str += ch;
ch = is.get();
}
return is;
}
ostream& operator<< (ostream& os, const string& str)
{
for (size_t i = 0; i < str.size(); i++)
{
os << str[i];
}
return os;
}
}
'; ++_size; } void string::append(const char* str) { size_t len = strlen(str); if (_size + len > _capacity) { reserve(_size + len); } strcpy(_str + _size, _str); _size += len; insert(_size, _str); } void string::insert(size_t pos, char ch) { assert(pos pos) { _str[end] = _str[end - 1] + 1; --end; } _str[pos] = ch; ++_size; } void string::insert(size_t pos, const char* str) { assert(pos _capacity) { reserve(_capacity+len); } size_t end = _size + len; while (end > pos+len+1) { _str[end] = _str[end - len]; --end; } memcpy(_str+pos,str,len); _size += len; } void string::erase(size_t pos, size_t len) { assert(pos = _size - pos) { _str[pos] = '
#include"string.h"
namespace STring
{
const size_t string::npos = -1;
string::iterator string::begin()
{
return _str;
}
string::const_iterator string::begin() const
{
return _str;
}
string::iterator string::end()
{
return _str + _size;
}
string::const_iterator string::end() const
{
return _str+_size;
}
string:: string(const char* str)
:_size(strlen(str))
{
_str = new char[_size+1];
_capacity = _size+1;
strcpy(_str, str);
}
string::string(const string& s)
{
_str = new char[s._capacity];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
}
string::~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
const char* string::c_str() const
{
return _str;
}
size_t string :: size() const
{
return _size;
}
void string::reserve(size_t n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = n;
}
}
void string::push_back(char ch)
{
if (_size == _capacity)
{
size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
reserve(newcapacity);
}
_str[_size] = ch;
_str[_size + 1] = '\0';
++_size;
}
void string::append(const char* str)
{
size_t len = strlen(str);
if (_size + len > _capacity)
{
reserve(_size + len);
}
strcpy(_str + _size, _str);
_size += len;
insert(_size, _str);
}
void string::insert(size_t pos, char ch)
{
assert(pos  pos)
{
_str[end] = _str[end - 1] + 1;
--end;
}
_str[pos] = ch;
++_size;
}
void string::insert(size_t pos, const char* str)
{
assert(pos  _capacity)
{
reserve(_capacity+len);
}
size_t end = _size + len;
while (end > pos+len+1)
{
_str[end] = _str[end - len];
--end;
}
memcpy(_str+pos,str,len);
_size += len;
}
void string::erase(size_t pos, size_t len)
{
assert(pos = _size - pos)
{
_str[pos] = '\0';
_size = len;
}
else
{
strcpy(_str + pos, _str + pos + len);
_size = len;
}
}
size_t string::find(char ch, size_t pos)
{
for (size_t i = pos; i  _size - pos)
{
string sub(_str + pos);
return sub;
}
else
{
string sub;
sub.reserve(len);
for (size_t i = 0; i < len; i++)
{
sub += _str[i + pos];
}
return sub;
}
}
string& string:: operator=(const string& s)
{
if (this != &s)
{
char* tmp = new char[s._capacity];
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
char& string::operator[](size_t pos)
{
if (pos < _size)
return _str[pos];
}
const char& string::operator[](size_t pos) const
{
if (pos < _size)
return _str[pos];
}
string& string::operator+=(char ch)
{
push_back(ch);
return *this;
}
string& string::operator+=(const char* str)
{
append(str);
return *this;
}
bool string::operator<(const string& s) const
{
return strcmp(_str, s._str) (const string& s) const
{
return !(*this <= s);
}
bool string::operator<=(const string& s) const
{
return *this =(const string& s) const
{
return !(*this > (istream& is, string& str)
{
str.clear();
char ch = is.get();
while (ch != ' ' && ch != '
')
{
str += ch;
ch = is.get();
}
return is;
}
ostream& operator<< (ostream& os, const string& str)
{
for (size_t i = 0; i < str.size(); i++)
{
os << str[i];
}
return os;
}
}
'; _size = len; } else { strcpy(_str + pos, _str + pos + len); _size = len; } } size_t string::find(char ch, size_t pos) { for (size_t i = pos; i _size - pos) { string sub(_str + pos); return sub; } else { string sub; sub.reserve(len); for (size_t i = 0; i < len; i++) { sub += _str[i + pos]; } return sub; } } string& string:: operator=(const string& s) { if (this != &s) { char* tmp = new char[s._capacity]; strcpy(tmp, s._str); delete[] _str; _str = tmp; _size = s._size; _capacity = s._capacity; } return *this; } char& string::operator[](size_t pos) { if (pos < _size) return _str[pos]; } const char& string::operator[](size_t pos) const { if (pos < _size) return _str[pos]; } string& string::operator+=(char ch) { push_back(ch); return *this; } string& string::operator+=(const char* str) { append(str); return *this; } bool string::operator<(const string& s) const { return strcmp(_str, s._str) (const string& s) const { return !(*this <= s); } bool string::operator<=(const string& s) const { return *this =(const string& s) const { return !(*this > (istream& is, string& str) { str.clear(); char ch = is.get(); while (ch != ' ' && ch != ' ') { str += ch; ch = is.get(); } return is; } ostream& operator<< (ostream& os, const string& str) { for (size_t i = 0; i < str.size(); i++) { os << str[i]; } return os; } }

以下是现代写法对于 传统写法的改进

一、push_back

传统写法:

void string::push_back(char ch)
{
		if (_size == _capacity)
		{
			size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
			reserve(newcapacity);
		}
		_str[_size] = ch;
		_str[_size + 1] = '
void string::push_back(char ch)
{
if (_size == _capacity)
{
size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
reserve(newcapacity);
}
_str[_size] = ch;
_str[_size + 1] = '\0';
++_size;
}
'; ++_size; }

现代写法:

	void string::push_back(char ch)
	{
		insert(_size, ch);
	}

二、append

传统写法:

	void string::append(const char* str)
	{
		size_t len = strlen(str);
		if (_size + len > _capacity)
		{
			reserve(_size + len);
		}
		strcpy(_str + _size, _str);
		_size += len;
		insert(_size, _str);
	}

现代写法:

	void string::append(const char* str)
	{
		insert(_size, str);
	}

本站无任何商业行为
个人在线分享 » string类的模拟实现的一些改进
E-->
© 2018 Theme by - 本站无任何商业行为 & WordPress Theme. All rights reserved 蒙ICP备2023002302号-2