自动进行空间扩展
/*
* The implementation of String like vector
*/
#include <iostream>
#include <cstring>
#include <iomanip>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
using std::istream;
using std::ostream;
using std::cout;
using std::endl;
using std::cin;
using std::setw;
class String{
public:
friend istream& operator>>(istream&,String&);
friend ostream& operator<<(ostream&,const String&);
friend String operator+(const String&,const String&);
friend String operator+(const String&,const char*);
public:
String():_string(0),_used(0),_len(0){}
String(int,char);
String(const char*);
String(const String&);
~String(){delete[] _string;}
String& operator=(const String&);
String& operator=(const char*);
String& operator+=(const String&);
String& operator+=(const char*);
String& operator+=(const char&);
bool operator==(const String &)const;
bool operator!=(const String &)const;
bool operator>(const String &)const;
bool operator>=(const String &)const;
bool operator<(const String &)const;
bool operator<=(const String &)const;
bool operator==(const char*)const;
bool operator!=(const char*)const;
bool operator>(const char*)const;
bool operator>=(const char*)const;
bool operator<(const char*)const;
bool operator<=(const char*)const;
char& operator[](int);//
const char& operator[](int)const;
int size(){return _used;}
char* c_str(){
Reserve(_used+1);
_string[_used+1]='\0';
return _string;
}
private:
void Reserve(size_t n);
char* _string;
int _used;
int _len;
};
void String::Reserve(size_t n){
if(_len<n){
size_t newlen=max(_len*1.5,n);
char* buf=new char[newlen];
strncpy(buf,_string,_used);
delete[] _string;
_string=buf;
_len=newlen;
}
}
istream& operator>>(istream& is,String& str){
const int limit_string_used=4096;
char inBuf[limit_string_used];
is>>setw(limit_string_used)>>inBuf;
str=inBuf;
return is;
}
ostream& operator<<(ostream& os,const String& str){
for(int i=0;i<str._used;i++)
os<<str._string[i];
return os;
}
String::String(int n,char ch) {
if(n<0)
n=-n;
_len=1.5*n;
_string=new char[_len];
_used=n;
for(int i=0;i<_used;i++)
_string[i]=ch;
}
String::String(const char* str) {
if(!str){
_used=0;
_len=0;
_string=NULL;
}
else{
size_t n=strlen(str);
_len=1.5*n;
_string=new char[_len];
_used=n;
strncpy(_string,str,_used);
}
}
String::String(const String& str) {
_len=str._len;
_used=str._used;
if(_used==0)
_string=0;
else{
_string=new char[_len];
strncpy(_string,str._string,_used);
}
}
String& String::operator=(const String& str) {
if(this!=&str){
Reserve(str._used);
_used=str._used;
strncpy(_string,str._string,_used);
}
return *this;
}
String& String::operator=(const char*str) {
if(!str){
_used=0;
}
else{
size_t n=strlen(str);
Reserve(n);
_used=n;
strncpy(_string,str,_used);
}
return *this;
}
String& String::operator+=(const String& str) {
if(str._used==0)
return *this;
size_t n=str._used;
Reserve(_used+n);
strncpy(_string+_used,str._string,n);
_used+=n;
return *this;
}
String& String::operator+=(const char* str) {
if(!str)
return *this;
size_t n=strlen(str);
Reserve(_used+n);
strncpy(_string+_used,str,n);
_used+=n;
return *this;
}
String& String::operator+=(const char& c) {
Reserve(_used+1);
_string[_used++]=c;
return *this;
}
bool String::operator==(const String& str)const {
if(_used==str._used)
return strncmp(_string,str._string,_used)==0?true:false;
else
return false;
}
bool String::operator!=(const String& str)const{
return !(*this==str);
}
bool String::operator>(const String& str)const{
if(_used==str._used)
return strncmp(_string,str._string,_used)>0?true:false;
else{
int n=min(_used,str._used);
int cmp=strncmp(_string,str._string,n);
if(cmp==0)
return _used<str._used;
else
return cmp>0;
}
}
bool String::operator>=(const String& str)const{
return *this==str||*this>str;
}
bool String::operator<(const String& str)const{
return !(*this>str);
}
bool String::operator<=(const String& str)const{
return *this==str||*this<str;
}
bool String::operator==(const char* str)const {
size_t n=strlen(str);
if(_used==n)
return strncmp(_string,str,_used)==0?true:false;
else
return false;
}
bool String::operator!=(const char* str)const {
return !(*this==str);
}
bool String::operator>(const char* str)const {
size_t sz=strlen(str);
if(_used==sz)
return strncmp(_string,str,_used)>0?true:false;
else{
int n=min(_used,sz);
int cmp=strncmp(_string,str,n);
if(cmp==0)
return _used<sz;
else
return cmp>0;
}
}
bool String::operator>=(const char* str)const {
return *this==str||*this>str;
}
bool String::operator<(const char* str)const {
return !(*this>str);
}
bool String::operator<=(const char* str)const {
return *this==str||*this<str;
}
char& String::operator[](int n){
if(n>=0&&n<_used)
return _string[n];
}
const char& String::operator[](int n)const {
if(n>=0&&n<_used)
return _string[n];
}
String operator+(const String&str1,const String& str2) {
if(str1._used==0&&str2._used==0)
return String();
else if(str1._used==0&&str2._used!=0){
return String(str2);
}
else if(str1._used!=0&&str2._used==0){
return String(str1);
}
else{
String newstr;
newstr._used=str1._used+str2._used;
newstr._len=newstr._used;
newstr._string=new char[newstr._len];
strncpy(newstr._string,str1._string,str1._used);
strncpy(newstr._string+str1._used,str2._string,str2._used);
return newstr;
}
}
String operator+(const String&str1,const char*str2) {
size_t len=strlen(str2);
if(str1._used==0&&len==0)
return String();
else if(str1._used==0&&len!=0){
return String(str2);
}
else if(str1._used!=0&&len==0){
return String(str1);
}
else{
String newstr;
newstr._used=str1._used+len;
newstr._len=newstr._used;
newstr._string=new char[newstr._len];
strncpy(newstr._string,str1._string,str1._used);
strncpy(newstr._string+str1._used,str2,len);
return newstr;
}
}
int main()
{
int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,
theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0;
// 为了使用 operator==( const char* )
// 我们并不定义 The( "The" )和 It( "It" )
String buf, the( "the" ), it( "it" );
// 调用 operator>>( istream&, String& )
while ( cin >> buf ) {
++wdCnt;
// 调用 operator<<( ostream&, const String& )
cout << buf << ' ';
if ( wdCnt % 12 == 0 )
cout << endl;
// 调用 String::operator==(const String&) and
//
if ( buf == the || buf == "The" )
++theCnt;
if ( buf == it || buf == "It" )
++itCnt;
// 调用 String::size()
for ( int ix = 0; ix < buf.size(); ++ix )
{
// 调用 String::operator[](int)
switch( buf[ ix ] )
{
case 'a': case 'A': ++aCnt;
break;
case 'e': case 'E': ++eCnt;
break;
case 'i': case 'I': ++iCnt;
break;
case 'o': case 'O': ++oCnt;
break;
case 'u': case 'U': ++uCnt;
break;
default: ++notVowel; break;
}
}
}
// 调用 operator<<( ostream&, const String& )
cout << "\n\n"
<<"Words read: " << wdCnt << "\n\n"
<<"the/The: " << theCnt << '\n'
<<"it/It: " << itCnt << "\n\n"
<<"non-vowels read: " << notVowel << "\n\n"
<<"a: " << aCnt << '\n'
<<"e: " << eCnt << '\n'
<<"i: " << iCnt << '\n'
<<"o: " << oCnt << '\n'
<<"u: " << uCnt << endl;
String a="hello";
String b="world";
String c=a+b;
cout<<c<<endl;
return 0;
}
* The implementation of String like vector
*/
#include <iostream>
#include <cstring>
#include <iomanip>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
using std::istream;
using std::ostream;
using std::cout;
using std::endl;
using std::cin;
using std::setw;
class String{
public:
friend istream& operator>>(istream&,String&);
friend ostream& operator<<(ostream&,const String&);
friend String operator+(const String&,const String&);
friend String operator+(const String&,const char*);
public:
String():_string(0),_used(0),_len(0){}
String(int,char);
String(const char*);
String(const String&);
~String(){delete[] _string;}
String& operator=(const String&);
String& operator=(const char*);
String& operator+=(const String&);
String& operator+=(const char*);
String& operator+=(const char&);
bool operator==(const String &)const;
bool operator!=(const String &)const;
bool operator>(const String &)const;
bool operator>=(const String &)const;
bool operator<(const String &)const;
bool operator<=(const String &)const;
bool operator==(const char*)const;
bool operator!=(const char*)const;
bool operator>(const char*)const;
bool operator>=(const char*)const;
bool operator<(const char*)const;
bool operator<=(const char*)const;
char& operator[](int);//
const char& operator[](int)const;
int size(){return _used;}
char* c_str(){
Reserve(_used+1);
_string[_used+1]='\0';
return _string;
}
private:
void Reserve(size_t n);
char* _string;
int _used;
int _len;
};
void String::Reserve(size_t n){
if(_len<n){
size_t newlen=max(_len*1.5,n);
char* buf=new char[newlen];
strncpy(buf,_string,_used);
delete[] _string;
_string=buf;
_len=newlen;
}
}
istream& operator>>(istream& is,String& str){
const int limit_string_used=4096;
char inBuf[limit_string_used];
is>>setw(limit_string_used)>>inBuf;
str=inBuf;
return is;
}
ostream& operator<<(ostream& os,const String& str){
for(int i=0;i<str._used;i++)
os<<str._string[i];
return os;
}
String::String(int n,char ch) {
if(n<0)
n=-n;
_len=1.5*n;
_string=new char[_len];
_used=n;
for(int i=0;i<_used;i++)
_string[i]=ch;
}
String::String(const char* str) {
if(!str){
_used=0;
_len=0;
_string=NULL;
}
else{
size_t n=strlen(str);
_len=1.5*n;
_string=new char[_len];
_used=n;
strncpy(_string,str,_used);
}
}
String::String(const String& str) {
_len=str._len;
_used=str._used;
if(_used==0)
_string=0;
else{
_string=new char[_len];
strncpy(_string,str._string,_used);
}
}
String& String::operator=(const String& str) {
if(this!=&str){
Reserve(str._used);
_used=str._used;
strncpy(_string,str._string,_used);
}
return *this;
}
String& String::operator=(const char*str) {
if(!str){
_used=0;
}
else{
size_t n=strlen(str);
Reserve(n);
_used=n;
strncpy(_string,str,_used);
}
return *this;
}
String& String::operator+=(const String& str) {
if(str._used==0)
return *this;
size_t n=str._used;
Reserve(_used+n);
strncpy(_string+_used,str._string,n);
_used+=n;
return *this;
}
String& String::operator+=(const char* str) {
if(!str)
return *this;
size_t n=strlen(str);
Reserve(_used+n);
strncpy(_string+_used,str,n);
_used+=n;
return *this;
}
String& String::operator+=(const char& c) {
Reserve(_used+1);
_string[_used++]=c;
return *this;
}
bool String::operator==(const String& str)const {
if(_used==str._used)
return strncmp(_string,str._string,_used)==0?true:false;
else
return false;
}
bool String::operator!=(const String& str)const{
return !(*this==str);
}
bool String::operator>(const String& str)const{
if(_used==str._used)
return strncmp(_string,str._string,_used)>0?true:false;
else{
int n=min(_used,str._used);
int cmp=strncmp(_string,str._string,n);
if(cmp==0)
return _used<str._used;
else
return cmp>0;
}
}
bool String::operator>=(const String& str)const{
return *this==str||*this>str;
}
bool String::operator<(const String& str)const{
return !(*this>str);
}
bool String::operator<=(const String& str)const{
return *this==str||*this<str;
}
bool String::operator==(const char* str)const {
size_t n=strlen(str);
if(_used==n)
return strncmp(_string,str,_used)==0?true:false;
else
return false;
}
bool String::operator!=(const char* str)const {
return !(*this==str);
}
bool String::operator>(const char* str)const {
size_t sz=strlen(str);
if(_used==sz)
return strncmp(_string,str,_used)>0?true:false;
else{
int n=min(_used,sz);
int cmp=strncmp(_string,str,n);
if(cmp==0)
return _used<sz;
else
return cmp>0;
}
}
bool String::operator>=(const char* str)const {
return *this==str||*this>str;
}
bool String::operator<(const char* str)const {
return !(*this>str);
}
bool String::operator<=(const char* str)const {
return *this==str||*this<str;
}
char& String::operator[](int n){
if(n>=0&&n<_used)
return _string[n];
}
const char& String::operator[](int n)const {
if(n>=0&&n<_used)
return _string[n];
}
String operator+(const String&str1,const String& str2) {
if(str1._used==0&&str2._used==0)
return String();
else if(str1._used==0&&str2._used!=0){
return String(str2);
}
else if(str1._used!=0&&str2._used==0){
return String(str1);
}
else{
String newstr;
newstr._used=str1._used+str2._used;
newstr._len=newstr._used;
newstr._string=new char[newstr._len];
strncpy(newstr._string,str1._string,str1._used);
strncpy(newstr._string+str1._used,str2._string,str2._used);
return newstr;
}
}
String operator+(const String&str1,const char*str2) {
size_t len=strlen(str2);
if(str1._used==0&&len==0)
return String();
else if(str1._used==0&&len!=0){
return String(str2);
}
else if(str1._used!=0&&len==0){
return String(str1);
}
else{
String newstr;
newstr._used=str1._used+len;
newstr._len=newstr._used;
newstr._string=new char[newstr._len];
strncpy(newstr._string,str1._string,str1._used);
strncpy(newstr._string+str1._used,str2,len);
return newstr;
}
}
int main()
{
int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,
theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0;
// 为了使用 operator==( const char* )
// 我们并不定义 The( "The" )和 It( "It" )
String buf, the( "the" ), it( "it" );
// 调用 operator>>( istream&, String& )
while ( cin >> buf ) {
++wdCnt;
// 调用 operator<<( ostream&, const String& )
cout << buf << ' ';
if ( wdCnt % 12 == 0 )
cout << endl;
// 调用 String::operator==(const String&) and
//
if ( buf == the || buf == "The" )
++theCnt;
if ( buf == it || buf == "It" )
++itCnt;
// 调用 String::size()
for ( int ix = 0; ix < buf.size(); ++ix )
{
// 调用 String::operator[](int)
switch( buf[ ix ] )
{
case 'a': case 'A': ++aCnt;
break;
case 'e': case 'E': ++eCnt;
break;
case 'i': case 'I': ++iCnt;
break;
case 'o': case 'O': ++oCnt;
break;
case 'u': case 'U': ++uCnt;
break;
default: ++notVowel; break;
}
}
}
// 调用 operator<<( ostream&, const String& )
cout << "\n\n"
<<"Words read: " << wdCnt << "\n\n"
<<"the/The: " << theCnt << '\n'
<<"it/It: " << itCnt << "\n\n"
<<"non-vowels read: " << notVowel << "\n\n"
<<"a: " << aCnt << '\n'
<<"e: " << eCnt << '\n'
<<"i: " << iCnt << '\n'
<<"o: " << oCnt << '\n'
<<"u: " << uCnt << endl;
String a="hello";
String b="world";
String c=a+b;
cout<<c<<endl;
return 0;
}