C 自己實現String類及其迭代器

2021-08-28 08:58:43 字數 4278 閱讀 4139

注意事項:

對於c語言字串char*,必須在末尾置'\0';

對指標操作時,必須考慮指標為null的情況,對strcpy,strcat等庫函式呼叫也一樣;

對指標重新賦值前必須呼叫delete,同一塊記憶體不能呼叫兩次delete;

返回物件的成員函式要區分返回的是當前物件還是新物件,即函式返回型別是否要取位址(&)

關於迭代器更新一點:

string* sp = new string("hello,world!");

string::iterator it = sp;

迭代器begin()指向string類首字元'h',end()指向末尾字元'!'之後一位的空字元'\0'.

順序迭代:

for (it = sp->begin(); it < sp->end(); it++)

cout << *it;

逆序迭代不能使用for迴圈(for迴圈不能輸出begin()位置的元素),而且必須用字首運算--it:

it = sp->end();

while(it > sp->begin())

cout << *--it;

再更新一下比較操作符「==」,見string.cpp具體實現

string.h

#ifndef string_h

#define string_h

#include class string

//// iterator end() const

private:

int len;

char* data;

/**迭代器

* 使用方法:

* string* sp = new string(s);

* 1.

* string::iterator it;

* it = sp;

* * 2.

* string::iterator it1(sp);

* *迭代器範圍:

* (it<=end()-1);

* (it>=begin());

* 對於+ -運算沒有檢查邊界

*/public:

class iterator

iterator(const iterator &rhs)

iterator(const string *sp)

iterator(const string *sp, int n)

~iterator()

char operator*()

iterator operator++(int)

iterator& operator++()

index++;

if (index > it->len)

it = null;

return *this;

}iterator operator--(int)

iterator& operator--()

index--;

if (index > it->len || index < 0)//越界

it = null;

return *this;

}bool operator==(const iterator &rhs)

return (it == rhs.it && index == rhs.index);

}bool operator!=(const iterator &rhs)

return !(*this == rhs);

}bool operator<(const iterator &rhs)

return (index < rhs.index);

}bool operator<=(const iterator &rhs)

return (index <= rhs.index);

}bool operator>(const iterator &rhs)

return (index > rhs.index);

}bool operator>=(const iterator &rhs)

return (index >= rhs.index);

}iterator operator+(const int k)

return iterator(it, index + k);

}iterator operator-(const int k)

return iterator(it, index - k);

}// friend class string;

private:

const string* it;

int index;

};iterator begin() const

iterator end() const

};#endif /* string_h */

string.cpp

/*

* to change this license header, choose license headers in project properties.

* to change this template file, choose tools | templates

* and open the template in the editor.

*/#include "string.h"

#include #include string::string()

string::string(const char* str) else

}string::~string()

}inline int string::length()const

char* string::tostring()const

char* string::c_str()const

string& string::insert(const char ch, const int n)

string& string::remove(const int n)

string& string::remove(const int start, const int nchars)

char string::operator(const int n) const

return *(data + n);

}std::ostream & operator<<(std::ostream & os, const string & str)

std::istream & operator>>(std::istream & is, const string & str)

int string::compare(const string& lhs, const string& rhs) const

if (lhs.len > rhs.len)

return 1;

if (lhs.len < rhs.len)

return 0;

return -1; //==

}bool string::operator==(const string &str)const

//return false;

return (compare(*this, str) == -1);

}bool string::operator!=(const string &str)const

bool string::operator>(const string &str)const

bool string::operator<(const string &str)const

string& string::operator+=(const string &str)

strcat(newstr, str.data);

newstr[len] = '\0';

data = newstr;

return *this;

}string string::operator+(const string &str)const

string& string::operator=(const string &str)

string::string(const string& str)

測試程式

#include #include "string.h"

#include using namespace std;

/* *

*/int main(int argc, char** argv)

自己實現簡單的string類

1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...

自己實現簡單的string類

1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...

自己實現簡單的string類

1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...