string 8.12 接口实现以及完结

// 8.12 string 应用.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//

//#include
//
//int main()
//{
// std::cout << “Hello World!\n”;
//}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

#include
#include
using namespace std;
//插入字符 任意位置插入字符
void insert(size_t pos, const char& ch)
{
//检查位置有效性 使用断言
assert(pos<=_size)
//检查容量
if (_size == _capacity)
{
size_t newC = _capacity == 0?15:2 * _capacity;
reserve(newC);
}
//移动元素[pos,size]
//从后向前移动 首先移动的值\0的位置
size_t end = _size + 1;
while (end > pos)
{
_data[end] = _data[end - 1];
–end;
}
//插入;pos
_data[pos] = ch;
//更新
++_size;
}
//插入字符串的操作
void insert(size_t pos, const char* ptr)
{
//检查位置有效性 使用断言
assert(pos <= _size)
//检查容量
int len = strlen(ptr);
if (_size + len > _capacity)
{
resreve(_size + len);
}
//移动元素[pos,size]
//从后向前移动 首先移动的值\0的位置
[pos,size]
size_t end = _size + len;
while (end > pos+len-1)
{
_data[end] = _data[end - len ];
–end;
}
//插入;pos
memcpy(_data + pos, ptr, sizeof(char)len);
//内存拷贝 不会拷贝\0
//更新
++_size += len;
//一定注意\0的插入,因为内存拷贝是不包含\0.
_data[_size] = ‘\0’;
}
//删除的操作。
//从前向后移动 借助覆盖来解决问题
void erase(size_t pos, size_t len)
{
//检查位置 位置的有效性。
assert(pos < _size)
//要删除的个数小于剩余字符的个数。
if (pos + len >= _size)
{
_size = pos;
_data[_size] = ‘\0’;
}
//移动元素
//从前相后移动【pos+1en.size】
size_t start = pos + len;
for (; start <= _size; ++start)
{
_data[pos++] = _data[start];
}
_size -= len;
}
//查找 默认位置为0
size_t find(const char& ch, size_t pos = 0)
{
//遍历查找
for (size_t i = 0; i < _size; ++i)
{
if (_data[i] == ch)
return i;
}
return npos;
}
size_t find(const char
str, size_t pos = 0)
{
//strstr返回值
//Null未找到
//有效地址,子串出现的首地址
char* ptr=strstr(_data,str)
if (ptr)
{
return ptr - _data;

	}
return npos;

}
//输出流对象 z作为成员函数,输出就是可以使用正常的输出方式。
ostream& operator<<(ostream& out)
{
for (const char& ch:*this);
out << ch;
return out;
}
//输入流对象
istream operator>>(istream& in, String& str)
{
char ch;
while (cin >> getchar())
{
if (ch == ‘’ || ch == ‘\n’ || ch == ‘\t’)
break;
str += ch;
}
return in;

}
bool operator>(const String& str1, const String& str2)
{
int ret = strcmp(str1.c_str(), str2.c_str());
if (ret > 0)
return true;
else
return false;
}
bool operator<(const String& str1, const String& str2)
{
int ret = strcmp(str1.c_str(), str2.c_str());
if (ret <0)
return true;
else
return false;
}
//bool operator>=(const String& str1, const String& str2)
//{
// return (this)!=
//}
private:
char
_data;
//size;有效字符的个数
size_t _size;
//capacity;可以保存的最大有效字符个数
size_t _capacity;
static const size_t npos
};
//类外初始化
const size_t String::npos = -1;//这是相当于0xffffffff

void test()
{
String str;
//头插
str.insert(0, ‘6’);
//尾插
str.insert(1, ‘7’);
//中间位置的插入
str.insert(1, ‘a’);

str.append("890123456789")
	str.insert(5, 'a');

str.erase(0, 2);
str.erase(10, 5);
str.erase(3, 3);

}
void test1()
{
String str = “1234”;
String str2 = “abcd”;
str2 << (str << cout);
cout << str1 << str2 << endl;
}
int main()
{
test();
return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值