CLX C++ Libraries - table
Author: clown

CLX C++ Libraries
Home >> table

# Declaration

    template <
        class Type,
        class Source = std::string,
        class Container = std::vector<std::vector<Type> >
    >
    class table;

# 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;
    typedef typename container::size_type size_type;
    typedef typename container::const_iterator const_iterator;

# 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>
    explicit table(std::basic_istream<Ch, Tr>& sin, Functor f);

    virtual ~table();

コンストラクタには，ファイル名，または入力ストリームを指定します．

    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 に格納します．

    const subcontainer& operator[](size_type pos) const;
    const subcontainer& at(size_type pos) const;
    const subcontainer& front() const;
    const subcontainer& back() const;

    bool empty() const;
    size_type size() const;

    const_iterator begin() const;
    const_iterator end() const;
    const_iterator rbegin() const;
    const_iterator rend() const;

    const container& data() const;

readline() および read() メソッドによって解析された結果へアクセスするためのメソッド群です． 解析結果は読み取り専用で，値の変更等を行うことはできません．

# Related Pages

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