C++的STL简介(二)
熬夜苦读学习 2024-08-04 09:05:13 阅读 68
目录
1.模拟实现string
1.string基本属性和大体框架
2.基本函数
2.1size()
2.2 []
2.3 begin() 和end()
2.4capacity()
2.5 reserve
2.6push_back
2.7 append
2.8 +=
2.9insert
2.10find
2.11substr
2.12 =
2.12 <
2.13 >
2.14 <=
2.15 >=
2.16 ==
2.17 !=
2.19 <<
2.20 >>
3.完整代码
string.h
string.c
1.模拟实现string
1.string基本属性和大体框架
<code>#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <string>
#include<assert.h>
namespace String
{
class string
{
public:
//默认构造
string(const char* str="")code>
{
_size = strlen(str);
//capacity不包含"\0"
_capacity = _size;
_str = new char[_capacity + 1];
strcpy(_str, str);
}
//析构函数
~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
//基本变量
private:
char* _str;
size_t _size;
size_t _capacity;
};
2.基本函数
2.1size()
内容个数
//模拟size()
size_t size()
{
return _size;
}
2.2 []
访问元素
#
//模拟[] 普通引用和const引用两个版本
char& operator[](size_t pos)
{
assert(pos < _size);
return _str[pos];
}
const char& operator[](size_t pos) const
{
assert(pos < _size);
return _str[pos];
}
2.3 begin() 和end()
简单用typedef重定义char* 来模拟iterator获取begin()和end()
typedef char* iterator;
iterator begin()
{
return _str;
}
iterator end()
{
return _str + _size;
}
2.4capacity()
获取容量
size_t capacity() const
{
return _capacity;
}
2.5 reserve
调整空间
void string::reserve(size_t n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = n;
}
}
2.6push_back
尾插字符
void string::push_back(char ch)
{
if (_size = _capacity)
{
reserve(_capacity == 0 ? 4 : _capacity * 2);
}
_str[_size++] = ch;
_str[_size] = '\0';
}
2.7 append
尾插支付串
void string::append(const char* str)
{
size_t len = strlen(str);
//大于二倍就要多少开多少,低于二倍按二倍开
if (_size + len > _capacity)
{
reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);
}
strcpy(_str + _size, str);
_size += len;
}
2.8 +=
string& string::operator+=(char ch)
{
push_back(ch);
return *this;
}
string& string::operator+=(const char* str)
{
append(str);
return *this;
}
2.9insert
在指定位置插入字符或字符串
void string::insert(size_t pos, char ch)
{
if (_size == _capacity)
{
reserve(_capacity == 0 ? 4 : _capacity * 2);
}
assert(pos <= _size);
size_t end = _size;
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(len==0)
return;
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 - len] = _str[end];
--end;
}
for (size_t i = 0; i < len; i++)
{
_str[pos + i] = s[i];
}
_size += len;
}
2.10 erase
删除指定位置元素
void string::erase(size_t pos, size_t len)
{
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;
}
}
2.10find
查找字符或字符串
size_t string::find(char ch, size_t pos = 0)
{
for (size_t i = pos; i < _size; i++)
{
if (_str[i] == ch)
{
return i;
}
}
return npos;
}
size_t string::find(const char* str, size_t pos = 0)
{
assert(pos < _size);
const char* ptr = strstr(_str + pos, str);
if (ptr == nullptr)
{
return npos;
}
else {
return ptr - _str;
}
}
2.11substr
提取字符重新构建string类
//深拷贝
string(const string&s)
{
_str = new char[s._capacity + 1];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
}
string string::substr(size_t pos, size_t len )
{
assert(pos < _size);
//len答疑剩余有效长度更新一下
if (len > _size - len)
{
len = _size - len;
}
string sub;
sub.reserve(len);
for (size_t i = 0; i < len; i++)
{
sub += _str[pos + i];
}
return sub;
}
2.12 =
//s2=s1
string& operator=(const string& s)
{//避免s1=s1出现释放了_str
if(this!=&s)
delete[] _str;
_str = new char[s._capacity];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
return *this;
}
2.12 <
bool operator<(const string& s1, const string& s2)
{
return strcmp(s1.Get_str(), s2.Get_str())<0;
}
2.13 >
bool operator>(const string& s1, const string& s2)
{
return !(s1 <= s2);
}
2.14 <=
bool operator<=(const string& s1, const string& s2)
{
return s1 < s2 || s1 == s2;
}
2.15 >=
bool operator>=(const string& s1, const string& s2)
{
return !( s1 < s2);
}
2.16 ==
bool operator==(const string& s1, const string& s2)
{
return strcmp(s1.Get_str(), s2.Get_str()) ==0;
}
2.17 !=
bool operator!=(const string& s1, const string& s2)
{
return !(s1 == s2);
}
2.18 clear
void clear()
{
_str[0]='\0';
_size=0;
}
2.19 <<
ostream& operator<<(ostream& out, const string& s)
{
for (auto ch : s)
{
out << ch;
}
return out;
}
2.20 >>
istream& operator >> (istream& in, string& s)
{
char ch;
ch = in.get();
while (ch != ' ' && ch != '\n')
{
s += ch;
ch = in.get();
}
return in;
}
3.完整代码
string.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <string>
#include<assert.h>
namespace String
{
class string
{
public:
//s1(s)
string(const string&s)
{
_str = new char[s._capacity + 1];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
}
string(const char* str="")code>
{
_size = strlen(str);
//capacity不包含"\0"
_capacity = _size;
_str = new char[_capacity + 1];
//+1位置给'\0'
strcpy(_str, str);
}
~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
//短小频繁,默认inline
//获取_str
char* Get_str() const
{
return _str;
}
//模拟size()
size_t size()
{
return _size;
}
//模拟实现capacity()
size_t capacity() const
{
return _capacity;
}
//简单用typedef重定义char* 来模拟iterator获取begin()和end()
typedef char* iterator;
iterator begin() const
{
return _str;
}
iterator end() const
{
return _str + _size;
}
//模拟[] 普通引用和const引用两个版本
char& operator[](size_t pos)
{
assert(pos < _size);
return _str[pos];
}
const char& operator[](size_t pos) const
{
assert(pos < _size);
return _str[pos];
}
//s2=s1
string& operator=(const string& s)
{//避免s1=s1出现释放了_str
if (this != &s)
delete[] _str;
_str = new char[s._capacity];
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity;
return *this;
}
void clear()
{
_str[0] = '\0';
_size = 0;
}
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* s);
void erase(size_t pos, size_t len = npos);
size_t find(char ch, size_t pos = 0);
size_t find(const char* str, size_t pos = 0);
string substr(size_t pos = 0, size_t len = npos);
private:
char* _str;
size_t _size;
size_t _capacity;
static const size_t npos;
};
bool operator>(const string& s1, const string& s2);
bool operator>=(const string& s1, const string& s2);
bool operator<(const string& s1, const string& s2);
bool operator<=(const string& s1, const string& s2);
bool operator<=(const string& s1, const string& s2);
bool operator==(const string& s1, const string& s2);
bool operator!=(const string& s1, const string& s2);
istream& operator>>(istream& out, const string& s);
istream& operator<<(istream& in, string& s);
}
string.c
//text.cpp
using namespace std;
#include"FileName.h"
namespace String
{
const size_t string::npos = -1;
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)
{
reserve(_capacity == 0 ? 4 : _capacity * 2);
}
_str[_size++] = ch;
_str[_size] = '\0';
}
string& string::operator+=(char ch)
{
push_back(ch);
return *this;
}
void string::append(const char* str)
{
size_t len = strlen(str);
if (_size + len > _capacity)
{
reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);
}
strcpy(_str + _size, str);
_size += len;
}
string& string::operator+=(const char* str)
{
append(str);
return *this;
}
void string::insert(size_t pos, char ch)
{
if (_size == _capacity)
{
reserve(_capacity == 0 ? 4 : _capacity * 2);
}
assert(pos <= _size);
size_t end = _size;
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 (len == 0)
return;
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 - len] = _str[end];
--end;
}
for (size_t i = 0; i < len; i++)
{
_str[pos + i] = s[i];
}
_size += len;
}
void string::erase(size_t pos, size_t len)
{
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 ch, size_t pos )
{
for (size_t i = pos; i < _size; i++)
{
if (_str[i] == ch)
{
return i;
}
}
return npos;
}
size_t string::find(const char* str, size_t pos )
{
assert(pos < _size);
const char* ptr = strstr(_str + pos, str);
if (ptr == nullptr)
{
return npos;
}
else {
return ptr - _str;
}
}
string string::substr(size_t pos, size_t len )
{
assert(pos < _size);
//len答疑剩余有效长度更新一下
if (len > _size - len)
{
len = _size - len;
}
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.Get_str(), s2.Get_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.Get_str(), s2.Get_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;
}
istream& operator >> (istream& in, string& s)
{
s.clear();
const int N = 256;
char buff[N];
int i = 0;
char ch;
//in >> ch ;
ch = in.get();
while (ch != ' ' && ch != '\n')
{
buff[i++] = ch;
if (i == N - 1)
{
buff[i] = '\0';
s += buff;
i = 0;
}
ch = in.get();
}
return in;
}
}
int main()
{
return 0;
}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。