-1

私は文字列クラス(プロジェクトスクール)を作成していますが、最後の作成イテレータに至るまで、どこから始めればよいかわかりません。開始と終了は想定していましたが、どのように実装されていますか。これまでのコードは次のとおりです。

class StringsTest {


public:
std::tr1::shared_ptr<char* > word; 
char* data;
int size;
int final;
int itSize;
StringsTest();
StringsTest(const StringsTest& orig);
virtual ~StringsTest();
StringsTest(char* strings);
StringsTest& swap( StringsTest& str2 );
int push_back(char a);
char pop_back();
int insert(int where, char what);
int erase(int where);
friend void operator<<(std::ostream& Ostr, const StringsTest& st);
friend std::istream& operator>>(std::istream& Istr, StringsTest& st);
char &operator[](int i);
int sizes();
int check();
stringIte& begin();
stringIte& end();



private:

protected:
};

#endif  /* STRINGPROJ_H *

//#endif    /* STRINGSTEST_H */

class stringIte {
public:
stringIte();
~stringIte();

そして始まり:

stringIte& StringsTest::begin() {
try {


} catch (std::exception e) {
    std::cout << " an error has ocurred " << e.what() << std::endl;
}
}

stringIte& StringsTest::end() {
try {



} catch (std::exception e) {

    std::cout << "nope " << e.what() << std::endl;

}
}

私はこのクラスを持っていますが、どのようにイテレータ begin() を実装しますか? ありがとう。

4

2 に答える 2

0

まず、参照によって反復子を返したくありません。それらを値で返します。

イテレーターは、コレクションの要素へのポインターのようなものです (この場合、文字列内の文字へ)。それらを実装する1つの方法は、typedef char *stringIte;生のポインターをイテレーターとして使用することです(必要なすべての機能を提供します)。begin()次に戻りdataend()戻りますdata + sizedataが文字列データへのポインタでありsize、終端のNUL.

StringTest*より洗練された方法は、たとえば aと を含む単純な構造でありint、逆参照時に文字列から適切な文字を返すことができます。

于 2012-12-04T13:06:27.820 に答える
0

あなたはすでに持っていますoperator[]。最も簡単な解決策は、反復子がStringTest オブジェクトへのポインターとインデックスを維持し、[]必要に応じて文字列に対して演算子を使用することです。これには、エラーチェックが容易になるという追加の利点があります。

イテレータが文字列クラスの内部構造をある程度知っていれば、より効率的な実装が可能です。たとえば、実際の文字が連続した配列にある場合、反復子は単一のポインターで構成できます (または への typedef にすることもできますchar*)。

于 2012-12-04T13:09:39.077 に答える