1

私のコードでは、一連の測定値 (float のベクトル) を扱っています。各要素には 2 つの関連する不確実性 (+up/-down など) があります。これらの値を画面にダンプしたいとしましょう。

Loop over the vector of the measurements
{
   cout << i-th central value << " +" << i-th up uncertainty << " / -" << i-th down uncertainty << end; 
}

それを行うための最も効率的/エレガントな方法は何ですか?

1) ベクトルのペアを使用する

vector<float> central; //central measurement
pair<vector<float>, vector<float>> errors; //errors
for( int i = 0; i < central.size ; i++ )
{
    cout << central.at(i) << " +" << errors.first.at(i) << " / -" << errors.second.at(i) << endl;
}

2) ペアのベクトルを使用:

vector<float> central; //central measurement
vector<pair<float,float>> errors; //errors
for( int i = 0; i < central.size ; i++ )
{
    cout << central.at(i) << " +" << errors.at(i).first << " / -" << errors.at(i).second << endl;
}

3) 2 つの別々のベクトル:

vector<float> central; //central measurement
vector<float> errUp; //errors up
vector<float> errDown; //errors down
for( int i = 0; i < central.size ; i++ )
{
    cout << central.at(i) << " +" << errUp.at(i) << " / -" << errDown.at(i) << endl;
}
4

3 に答える 3

7

これ:

各要素には 2 つの関連する不確実性 (+up/-down など) があります。

あなたの3つの要素(値+上/下)を含むオブジェクトがあると私に言います。そのため、そのオブジェクトを作成し、それらを 1 つのベクトルに格納します。

複数のベクトルを使用して保存するということは、それらを同期させておく必要があることを意味します (トランザクション的に両方に追加するなど)。それはせいぜい面倒であり、安全のためにそれらのベクトルをカプセル化する必要があります。

于 2013-10-02T14:57:12.517 に答える
4

トリプルのベクトルはどうですか?

#include <array>
#include <vector>

using Measurement = std::array<float, 3>;

std::vector<Measurement> data;
于 2013-10-02T14:55:40.400 に答える
2

単一の責任のために Measurement と呼ばれるクラスまたは構造体を作成します。不確実性の上下に 2 つの値は必要ない場合があります。ほとんどの場合、これらは符号に関係なく同じです。つまり、1 つの不確かさの値で十分な場合があります。

struct Measurement
{
  union
  {
    float values[3];
    struct { float value, uncertaintyUp, uncertaintyDown; };
  };
}

ユニオンを使用すると、必要な可読性と [] 演算子の柔軟性が得られます。

main()
{
  Measurement x;
  x.value = 1.0f;
  x.uncertaintyUp = 0.1f;
  x.uncertaintyDown = -0.1f;

  for(int i = 0; i < 3; i++)
  {
    cout << x.values[i] << " ";
  }
}

ここから、Measurement 構造体のベクトルを使用するのは簡単です。データに 1 つのコンテナーを使用できる場合は、常にそれが最適です。考えてみると、3 つのベクトルすべてのすべてのデータは、カウントと容量に関して常に同じであり、追加のオーバーヘッドは必要ありません。1 つのベクトルが時空間を節約します。

于 2013-10-02T15:41:08.917 に答える