Accelerated C++、演習 14.5 にはsplit
関数の再実装が含まれます (テキスト入力を文字列のベクトルに変換します)。std::string
- のようなクラス ( Str
)でストア入力を使用し、関数を使用して、- のようなコンテナーであるsplit
を返す必要があります。このクラスは、基になる へのカスタム ポインタ ( ) を管理します。Vec<Str>
Vec
std::vector
Str
Ptr
Vec<char> data
このStr
クラスは、以下のようにコンストラクターを提供Str(i,j)
しStr.h
ます。これPtr
は、基礎となるを構築し
ます。問題が発生するコードで詳しく説明したVec
呼び出しによって部分文字列を作成しようとすると、問題が発生します。str(i,j)
これは、クラスの簡略化されたバージョンですStr
(必要に応じて、より多くのコードを投稿できます)。
Str.h
#include "Ptr.h"
#include "Vec.h"
class Str {
friend std::istream& operator>>(std::istream&, Str&);
public:
// define iterators
typedef char* iterator;
typedef char* const_iterator;
iterator begin() { return data->begin(); }
const_iterator begin() const { return data->begin(); }
iterator end() { return data->end(); }
const_iterator end() const { return data->end(); }
//** This is where we define a constructor for `Ptr`s to substrings **
template<class In> Str(In i, In j): data(new Vec<char>) {
std::copy(i, j, std::back_inserter(*data));
}
private:
// store a Ptr to a Vec
Ptr< Vec<char> > data;
};
Split.h
Vec<Str> split(const Str& str) {
typedef Str::const_iterator iter;
Vec<Str> ret;
iter i = str.begin();
while (i != str.end()) {
// ignore leading blanks
i = find_if(i, str.end(), not_space);
// find end of next word
iter j = find_if(i, str.end(), space);
// copy the characters in `[i,' `j)'
if (i != str.end())
ret.push_back(**substring**); // Need to create substrings here
// call to str(i,j) gives error, detailed below
i = j;
}
return ret;
}
私が最初に考えたのは、このコンストラクターを使用して、必要な部分文字列を作成 (ポインター) することでした。ここで呼び出すstr(i,j)
とエラーメッセージが表示されます
type 'const Str' does not provide a call operator
- ここで簡単に呼び出すことはできないよう
str(i,j)
です。なぜだめですか? Str
に似たメンバー関数を作成することで解決できsubstr
ますか?