Declaration
template < class Type, class Source = std::string, class Container = std::vector<std::vector<Type> > > class table : private container_generator<Container>, public random_accessor<Container>;
Overview
table は,CSV 形式などの整形されたテキストファイルを読み込んで,x[i][j] のように各要素に対してランダムアクセスを行えるようにするためのクラスです. 指定されたテキストファイルから一行ずつ読み込み, コンストラクタで指定された関数オブジェクト(または関数ポインタ) を用いて分割して結果を Container に格納します. 指定する関数オブジェクトは,文字列をある規則にしたがって分割し, 分割した結果をコンテナに格納して返すような機能を持つようなクラス(または, 関数)である必要があります.例えば,デフォルトのテンプレート引数の場合, 必要となる関数オブジェクトのインターフェースは下記のようになります.
template <class Type> class parser { public: std::vector<Type> operator()(const std::string& s); };
尚,tokenizer は上記の要件を満たしているため, 文字列分割用の関数オブジェクトとして利用することができます.また, CLX C++ Libraries の中に create_tokenizer と言う補助関数を用意しています. 使用方法は,Example を参照して下さい.
template <class Type, class TokenizerFunc> basic_tokenizer<TokenizerFunc, Type> create_tokenizer(TokenizerFunc f);
Example
#include <iostream> #include "clx/table.h" int main(int argc, char* argv[]) { /* * create_tokenizer()は,下記の場合, * clx::basic_tokenizer<clx::char_separator<char>, double> * という型宣言を省略するための補助関数. */ clx::char_separator<char> sep(','); // 分割方法を決めるためのポリシークラス clx::table<double> v(std::cin, clx::create_tokenizer<double>(sep)); for (size_t i = 0; i < v.size(); i++) { double sum = 0.0; for (size_t j = 0; j < v[i].size(); j++) sum += v[i][j]; std::cout << "line " << i + 1 << ": num " << v[i].size() << ", sum " << sum << ", average " << sum / v[i].size() << std::endl; } return 0; }
test.dat 100,60,70,80,80 89,85,82,90,75 75,60,65,60,80 80,90,80,80,80 90,85,83,50,75 Result line 1: num 5, sum 390, average 78 line 2: num 5, sum 421, average 84.2 line 3: num 5, sum 340, average 68 line 4: num 5, sum 410, average 82 line 5: num 5, sum 383, average 76.6
Template Parameters
- Type
- 格納する要素の型を指定します
- Source
- 文字列の型を指定します.デフォルト値は,std::string.
- Container
- 分割した文字列を格納するためのコンテナを指定します. デフォルト値は,std::vector<std::vector<Type> >.
Related Types
typedef Type value_type; typedef Source string_type; typedef Container container; typedef typename container::value_type subcontainer;
Construction and Member Functions
template <class Functor> table(Functor f); template <class Functor> table(const string_type& path, Functor f); template <class Ch, class Tr, class Functor> table(std::basic_istream<Ch, Tr>& sin, Functor f); virtual ~table() throw();
コンストラクタには,ファイル名,または入力ストリームを指定します.
template <class Ch, class Tr> bool readline(std::basic_istream<Ch, Tr>& sin); template <class Ch, class Tr> table& read(std::basic_istream<Ch, Tr>& sin); table& read(const string_type& path); void reset();
readline() メソッドは引数として指定された入力ストリームから 1 行読み込み, ポリシーに基づいて分割した後,結果を table に格納します.read() メソッドは, ファイルから文字列を全て読み込み,ポリシーに基づいて分割した後,結果を table に格納します.
readline() および read() メソッドによって解析された結果へのアクセスは, Container で提供されている各メソッドを利用して行います. Container (の継承)に関する詳細は,container_wrapper を参照して下さい.