- 締切済み
STLを使ったデータ定義を添削ください
C++の設計は初めてです。以下のデータをC++のSTLを使って表そうしているのですが、添削をお願いします。 STLを使えるだけ使った方が開発効率が上がるかと思い、使っています。このデータにSTLなんぞ使う必要もなければ、ご指摘いただきたく、よろしくお願いします。 (1)2次元のテーブルデータを含む構造体 この構造体を使用する時は、等間隔のテーブルデータを線形補間します。与えられたxの前後のx座標を計算し、計算したx座標からy座標を取得します。 struct measurement{ char* dat_name; // データ名称 int detect_id; // 測定器ID double start_x; // x座標開始点 double bin_width; // x座標ステップ幅 std::map<double, double> measurement; // map<x座標,y座標> }; (2)可変の大きさの構造体(表現方法にあまり自信ありません) vector <measurement> measurement_list;
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
こんな感じでどうでしょう。 template <typename T> class measurement { std::string dat_name_; int detect_id_; T start_x_; T bin_width_; std::vector<T> data_; public: measurement() : detect_id_(-1), start_x_(0), bin_width_(0) {} template<class InputIterator> measurement(int detect_id, T start_x, T bin_width, InputIterator first, InputIterator last) : detect_id_(detect_id), start_x_(start_x), bin_width_(bin_width) data_(first, last) {} measurement& operator=(const measurement& src) { measurement temp(src); swap(temp); return *this; } void swap(measurement& other) { dat_name_.swap(other.dat_name_); std::swap(start_x_, other.start_x_); std::swap(bin_width, other.bin_width_); data_.swap(other.data_); } T f(T x) { // 線形補完後のyを返す } }; 必要に応じて、dat_name_等を参照するメンバ関数を追加してください。 用途を見る限り、おそらく std::map は不要で、std::vector で十分かと思います。場合によっては、std::valarray もよいかもしれません。
- rabbit_cat
- ベストアンサー率40% (829/2062)
そうですね。 measurementを単なる構造体にするのではなくて、 > テーブルデータを線形補間します。与えられたxの前後のx座標を計算し ここらへんの機能も含めたクラスにするのがいいのでは。 あと、 char* dat_name; は、おそらく std::string dat_name にしたほうがいいのでは。 どっかに「データ名称」を保存しておく場所が他にあるのならこのままでいいですが。
お礼
お礼が遅くなって、すみません。早速のご回答どうもありがとうございました。アドバイスの通り、構造体ではなくクラスにしてみます。std::stringにも納得です。ありがとうございました。
お礼
お礼が遅くなり、すみませんでした。早速のご回答どうもありがとうございました。テンプレートクラスにすると良いのですね。恥ずかしながら、std::valarrayというのは、初めて見ました。経験豊富な方の例は、とても参考になります。今、ここまでのものをちゃっちゃと作れる自信はありませんが、参考にさせていただきます。ありがとうございました。