2

BOOST uBLAS ベクターのコンストラクターの動作を変更しようとしていますが、これを行う最善の方法は何だろうと考えていました。たとえば、コンストラクターを使用して 2D ベクトルのコンポーネント (座標) を初期化したい:

それ以外の:

typedef boost::ublas::vector BoostVector;

double x=1;
double y=0.7;

BoostVector<double> v(2);
v(1) = x; v(2) = y; //x and y are vector components/co-ordinates

コンストラクタで x と y を指定できるようにしたい。

BoostVector<double> v(x,y);

ブースト ベクター クラスを含むか継承することで、これを行うためのインターフェイスを提供する新しいクラスを作成できると考えていますが、私は C++ にかなり慣れていないため、保持する最善の方法がわかりません。ブーストベクターの機能。特に、uBLAS ベクター クラスで使用されるテンプレート式の最適化に干渉したくないためです。これに関するアドバイスをいただければ幸いです。ありがとう、キエラン

4

3 に答える 3

0

多次元配列または2つの座標のような2D? 多次元の場合は、ベクトルのベクトルを使用します。

vector<vector<type>> v;

この場合、x と y の意味がわかりません。また、() 演算子ではなく [] 演算子を使用します:v[1] = xなど

2 つの座標 (x 軸、y 軸) の場合、次のようにします。

template <class T>
class Vector2
{
public:
    Vector2(const T& x, const T& y) : mX(x), mY(y) {}

private:
    T x;
    T y;
};

既存の std::vector を使用するのではなく、独自の Vector2 クラスを作成する傾向がある理由は、保存しているすべてが 2 つの値である場合に使用しない大量のオーバーヘッドを取り除くためです。これには、動的メモリ割り当て、配列の長さの格納などが含まれます。2 つの値を格納するだけであれば、そのすべては必要ありません。

于 2011-12-05T21:01:58.117 に答える
0

猫の皮を剥ぐ方法はたくさんあります。

  1. C++0x 統一イニシャライザをお探しですか:

    std::vector<type> v { x, y };
    
  2. または単純な古い C++03:

    type arr[] = { x,y };
    std::vector<type> v(arr, arr+2);
    
  3. 構造体のような動作をするクラスが必要な場合は、タプルを使用します。

    std::tuple<type, type> point(x,y);
    

    タプルは TR1、C++0x、および Boost にあります。それらにはあらゆる種類の気の利いた機能があります (std::pair、std::less などとの自動相互運用性など)。


上記のすべてがない場合、次のようになります。

typedef std::pair<type, type> point_t;

point_t p(x,y);
于 2011-12-05T21:02:31.593 に答える