ViVi Home > 技術文書 > ポインタ入門 > 文字列クラス演習問題


 

 

C/C++ ポインタ入門 > 文字列クラス 演習問題
Nobuhide Tsuda
Oct-2013

演習問題

String は char 文字列を持つ文字列クラスです。
operator[](ix), at(ix) で文字を参照でき、insert(ix), erase(ix) 等で文字を挿入・削除することが出来ます。
文字挿入時に文字列領域が足りなくなると、文字列領域が自動的に拡張されます。
上記以外にも、isEmpty(), size() などオブジェクトの状態を返すメンバ関数や、 resize(sz, ch), reserve(sz) などでオブジェクトの状態を変えるメンバ関数を持ちます。
std::string と概ね同一ですが、文字型が char型固定という点が異なります。

String は文字列を格納する領域を動的に確保し、m_data がそこを指します。
確保した文字列領域のサイズが m_allocSize に格納されます。
文字列領域の頻繁な再確保を避けるために、領域は実際のサイズよりも余分に確保されます。
m_size に文字列領域に実際に保存されている文字数('\0'はカウントしない)が格納されます。
※ 動的配列とほとんど同じですが、文字列の末尾には '\0' が格納されている点が異なります。
※ そのため、再アロケート無しに格納できる文字数上限(キャパシティ)は allocSize - 1 となります。


文字が追加され文字列領域が足りなくなった場合、領域サイズは2倍されてメモリが確保され、 古い領域から新しい領域に文字列がコピーされ、古い領域のメモリは解放されます。

  1. 下記のクラスを定義するコードを書き、ビルドしてみなさい。
  2. class String {
    private:
        char *m_data;         // 文字列を格納するエリア、'\0' ターミネイトされている
        int    m_size;           // 文字数、'\0' は数に含まない
        int    m_allocSize;    // アロケートされた m_data のサイズ
    };
    
  3. String クラスにコンストラクタ String() を追加し、サイズを 0 に、アロケートサイズを 8 に, m_data がアロケートしたメモリ領域を指すよう初期化しなさい。
  4. String クラスにデストラクタ ~String() を追加し、m_data を delete するようにしなさい。
  5. コンストラクタ String(int sz, char c) を追加し、サイズ、キャパシティを sz に、 m_data がアロケートしたメモリ領域を指すようにし、文字列にすべて c を格納しなさい。
  6. コンストラクタ String(const char *src) を追加し、 引数で指定された文字列(終端文字有り)と同じ文字列をオブジェクトに設定しなさい。
  7. コンストラクタ String(const char *first, const char *last) を追加し、 引数で指定された範囲の文字(終端文字無し)と同じ文字列をオブジェクトに設定しなさい。
  8. ★★ コピーコンストラクタ String(const String &str) を追加(実装)しなさい。
    文字列 str がアロケートしているメモリと同じサイズのメモリを new でアロケートし m_data がそこを指すようにし、 str が指すデータを m_data の部分にコピーしなさい。 m_size は str の指す文字列サイズを設定するようにしなさい。

  9. bool isEmpty() const 文字列が空かどうかを判定するメンバ関数を実装しなさい。
  10. int size() const String オブジェクトの文字数を返すメンバ関数を実装しなさい。
  11. int capacity() const String オブジェクトのキャパシティ(再アロケートせずに格納できる最大文字数)を返すメンバ関数を実装しなさい。
  12. char front() const 先頭の1文字を返すメンバ関数を実装しなさい。文字列が空の場合は '\0' を返しなさい。
  13. char back() const 末尾の1文字を返すメンバ関数を実装しなさい。文字列が空の場合は '\0' を返しなさい。
  14. char operator[](int ix) const 文字列の ix 番目の文字を返すメンバ関数を実装しなさい。 ix が範囲外の場合は '\0' を返しなさい。
  15. const char *c_str() const String オブジェクトが保持する文字列を返すメンバ関数を実装しなさい。
  16. ★★int find(char ch) const 文字列を検索し最初の ch の位置を返すメンバ関数を実装しなさい。文字を含んでいない場合は -1 を返しなさい。
  17. ★★int find(const String &str) const 文字列から str を検索し、最初にマッチする位置を返すメンバ関数を実装しなさい。文字列を含んでいない場合は -1 を返しなさい。
    ※ 文字列検索には strstr() を使用してよいものとする。
  18. ★★ostream &operator<<(ostream &, const String &) 出力ストリームに文字列を出力する operator<<() 関数をオーバライドしなさい。 ※ メンバ関数ではないので注意

  19. void clear() 文字列を空にするメンバ関数を実装しなさい。
  20. ★★void reserve(int sz) String オブジェクトのキャパシティを指定するメンバ関数を実装しなさい。
  21. ★★void resize(int sz, char ch = ' ') String オブジェクトの文字数を指定するメンバ関数を実装しなさい。 文字数が増える場合は、第2引数の文字を追加するようにしなさい。
  22. ★★void pop_back() 文字列最後の文字を削除するメンバ関数を実装しなさい。文字列が空の場合は何も処理を行わないものとする
  23. ★★void push_back(char ch) 文字列末尾に文字 ch を追加するメンバ関数を実装しなさい。
  24. ★★String &operator+=(char ch)
  25. ★★String &operator+=(const String &str)
  26. ★★void insert(int ix, char ch)
  27. ★★void erase(int ix)
  28. ★★void replace(int ix, int len, const String &str)
  29. ★★void swap(String &)
  30. ★★Strign &assign(const String &)
  31. ★★String &operator=(const String &str)
  32. ★★String operator+(const String &lhs, const String &rhs)

 


前: |上:C/C++ ポインタ入門 |次: