#include "string.h"
namespace Alen
{
const size_t string::npos = -1;
void string::reserve(size_t newCapacity)
{
if (newCapacity > _capacity)
{
char* tmp = new char[newCapacity + 1]; // 多一个空间存'\0'
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = newCapacity;
}
}
void string::clear()
{
_str[0] = '\0';
_size = 0;
}
void string::push_back(char c)
{
if (_size == _capacity)
reserve(_capacity == 0 ? 4 : _capacity * 2); // 进行2倍扩容
_str[_size++] = c;
_str[_size] = '\0'; // !!!
}
string& string::operator+=(char c)
{
push_back(c);
return *this;
}
void string::append(const char* s)
{
size_t len = strlen(s);
if (_size + len > _capacity)
{
reserve(_size + len > _capacity * 2 ? _size + len : _capacity * 2);
}
strcpy(_str + _size, s);
_size += len;
}
string& string::operator+=(const char* s)
{
append(s);
return *this;
}
void string::insert(size_t pos, char ch)
{
assert(pos <= _size);
if (_size == _capacity)
reserve(_capacity == 0 ? 4 : _capacity * 2);
// 挪动数据
// end 是int类型,pos是size_t类型,比较会将end隐式类型转换成size_t
// 当end为-1的(即pos为0)时候,就成为了size_t的最大值
//int end = _size;
//while (end >= pos)
//{
// _str[end + 1] = _str[end];
// --end;
//}
//_str[pos] = ch;
//++_size;
size_t end = _size + 1;
while (end > pos)
{
_str[end] = _str[end - 1];
--end;
}
_str[pos] = ch;
++_size;
}
void string::insert(size_t pos, const char* s)
{
assert(pos <= _size);
size_t len = strlen(s);
if (_size + len > _capacity)
reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);
// 挪动数据
size_t end = _size + len;
while (end > pos + len - 1)
{
_str[end] = _str[end - len];
}
for (size_t i = 0; i < len; i++)
{
_str[pos + i] = s[i];
}
}
void string::erase(size_t pos, size_t len)
{
assert(pos < _size);
if (len >= _size - pos)
{
_str[pos] = '\0';
_size = pos;
}
else
{
for (size_t i = pos + len; i <= _size; i++)
{
_str[i - len] = _str[i];
}
_size -= len;
}
}
size_t string::find(char c, size_t pos)
{
for (size_t i = pos; i < _size; i++)
{
if (_str[i] == c)
{
return i;
}
}
return npos;
}
// 可以使用KMP、BM算法
size_t string::find(const char* s, size_t pos)
{
assert(pos < _size);
const char* ptr = strstr(_str + pos, s);
if (ptr == nullptr)
{
return npos;
}
else
{
return ptr - _str;
}
}
string string::substr(size_t pos, size_t len)
{
assert(pos < _size);
if (len > _size - pos)
{
len = _size - pos;
}
string sub;
sub.reserve(len);
for (size_t i = 0; i < len; i++)
{
sub += _str[pos + i];
}
return sub;
}
bool operator<(const string& s1, const string& s2)
{
return strcmp(s1.c_str(), s2.c_str()) < 0;
}
bool operator<=(const string& s1, const string& s2)
{
return s1 < s2 || s1 == s2;
}
bool operator>(const string& s1, const string& s2)
{
return !(s1 <= s2);
}
bool operator>=(const string& s1, const string& s2)
{
return !(s1 < s2);
}
bool operator==(const string& s1, const string& s2)
{
return strcmp(s1.c_str(), s2.c_str()) == 0;
}
bool operator!=(const string& s1, const string& s2)
{
return !(s1 == s2);
}
ostream& operator<<(ostream& out, const string& s)
{
for (auto ch : s)
{
out << ch;
}
return out;
}
void IN(istream& in ,string& s, char option = '\n')
{
char ch;
const int N = 256;
char buff[N]; // 利用缓存区的思路,来减少string的扩容操作,增加效率
int i = 0;
ch = in.get(); // = C语言的getc一个字符一个字符读
while (option == ' ' ? ch != ' ' && ch != '\n' : ch != option)
{
buff[i++] = ch;
if (i == N - 1)
{
buff[i] = '\0';
s += buff;
i = 0;
}
//s += ch;
ch = in.get();
}
if (i > 0)
{
buff[i] = '\0';
s += buff;
}
}
istream& operator>>(istream& in, string& s)
{
s.clear();
/*
char ch;
//in >> ch; // 将 ' ' 与 '\n'作为分隔符,直接忽视不会读取
//while (ch != ' ' && ch != '\n')
//{
// s += ch;
// in >> ch;
//}
const int N = 256;
char buff[N]; // 利用缓存区的思路,来减少string的扩容操作,增加效率
int i = 0;
ch = in.get(); // = C语言的getc一个字符一个字符读
while (ch != ' ' && ch != '\n')
{
buff[i++] = ch;
if (i == N - 1)
{
buff[i] = '\0';
s += buff;
i = 0;
}
//s += ch;
ch = in.get();
}
if (i > 0)
{
buff[i] = '\0';
s += buff;
}
*/
IN(in, s, ' ');
return in;
}
istream& getline(istream& in, string& s, char delim)
{
s.clear();
IN(in, s, delim);
return in;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论




























格式:pdf 资源大小:5.1MB 页数:295

收起资源包目录





共 3 条
- 1
资源评论


国腾精英
- 粉丝: 517
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
