CLX C++ Libraries
Home >> table

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

example_table.cpp

#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 を参照して下さい.

Related Pages

  1. CLX C++ Libraries - tokenizer
  2. CLX C++ Libraries - tokenizer_func
  3. CLX C++ Libraries - container_wrapper