c++写的一个简单的string类

这是刚开始学c++时候写的一个string类,有些细节还值得推敲,一直没时间重写写过,放在这以后再改改
#ifndef _MYSTRING_H
#define _MYSTRING_H

#include<cctype>
#include<algorithm>
#include<vector>
#include<cassert>
namespace mstr
{
class mystring
{
	public:
		typedef unsigned int size_type;
		mystring(){}; 
		mystring(size_type n,char c):data(n,c){}
		mystring(const char* cp);

		~mystring();
		
		size_type size()const{return data.size();}

		char& operator[](size_type i);
		const char& operator[](size_type i)const;

		friend std::istream& operator>>(std::istream&,mystring&);
		friend std::ostream& operator<<(std::ostream&,const mystring&);

		mystring& operator+=(const mystring&);

		mystring getSub(size_type sBegin,size_type Len);
		const mystring getSub(size_type sBegin,size_type Len)const;
		const char* c_str()const;

		bool hasSub(const mystring&sub);

		bool operator<(const mystring&ls)const;
	private:
		std::vector<char> data; 
};
mystring::mystring(const char* cp)
{
	int i=0;
	while(cp[i]!='\0'&&++i);
	assert(cp[i]=='\0');
	std::copy(cp,cp+i,std::back_inserter(data));
}
char& mystring::operator[](size_type i)
{
	return data[i];
}
const char& mystring::operator[](size_type i)const
{
	return data[i];
}
mystring& mystring::operator+=(const mystring&s)
{
	std::copy(s.data.begin(),s.data.end(),std::back_inserter(data));
	return *this;
}

bool mystring::operator<(const mystring&ls)const
{
	size_type i=0;
	for(;i!=size()&&i!=ls.size();i++)
	{
		if(data[i]==ls[i])
			continue;
		else if(data[i]>ls[i])
			return false;
		else
			return true;
	}
	if(i==ls.size()&&i!=size())
		return true;
	else return false;
}

mystring mystring::getSub(size_type sBegin,size_type Len)
{
	mystring sub;
	if(sBegin+Len>=size())
		return 0;
	for(size_type i=0;i!=Len;i++)
		sub[i]=data[i+sBegin];
	return sub;
}
const mystring mystring::getSub(size_type sBegin,size_type Len)const
{
	mystring sub;
	if(sBegin+Len>=size())
		return 0;
	for(size_type i=0;i!=Len;i++)
		sub[i]=data[i+sBegin];
	return sub;
}
const char* mystring::c_str()const//?????????
{
	size_type len=size()+1;
	char *str=new char[len];
	for(size_type i=0;i!=len-1;i++)
	{
		str[i]=data[i];
	}
	str[len-1]='\0';
	return str;
}
bool mystring::hasSub(const mystring& sub)
{
	if(sub.size==0)
		return true;
	size_type i=0,j=0;
	while(i!=size())
	{
		while(data[i]==sub[j])
		{
			i++;
			j++;
			if(j==sub.size())
				return true;
			if(i==size())
				return false;
		}
		i++;
	}
	return false;
}
mystring::~mystring()
{
	
}
std::ostream& operator<<(std::ostream& os,const mystring& s)
{
		for(mystring::size_type i=0;i!=s.size();i++)
		os<<s[i];
	return os;
}
	std::istream& operator>>(std::istream& is,mystring& s)
{
	s.data.clear();
	char c;
	while(is.get(c)&&isspace(c));
	if(is)
	{
		do s.data.push_back(c);
		while(is.get(c)&&!isspace(c));
	}
	return is;
}
		int cmp(const mystring&s1,const mystring& s2)
{
	if(s1<s2)
		return -1;
	else if(s2<s1)
		return 1;
	else
		return 0;
}
	mystring operator+(const mystring& left,const mystring& right)
{
	mystring r=left;
	r+=right;
	return r;
}
}//the end of namespace mstr

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值