3

C++ で簡単で基本的なベクトル演算ライブラリを設計しました。高速の外積やベクトル間の角度が必要な場合は、コマンド ラインからプログラムを呼び出します。起動時間が計算時間よりも長いため、Matlab や Octave などは使用しません。繰り返しますが、これは非常に基本的な操作です。

私はこのプログラムを拡張しており、次のタイプの操作の RPN 計算機として機能するようにします。

1 2 3
4 5 6
x
out: -3 6 -3

(1 つのベクトル、別のベクトル、および「交差」演算子を指定します。外積を吐き出します)

スタックは、次のような操作のために、3d ベクトルまたはスカラーを受け入れる必要があります。

1 2 3
2
*
out: 2 4 6

このミニ計算機のレクサーとパーサーは自明ですが、内部スタックを作成するための良い方法が思いつかないようです。ベクトルまたは double を含むためのスタックをどのように作成しますか (私は独自の非常に単純なベクトル クラスをロールアップしました - 100 行未満で、必要なすべてを実行します)。

クラス Vector または型 double の要素を受け入れる単純なスタックを作成するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

3

boost::anyを見たことがありますか?

于 2010-05-14T16:41:13.777 に答える
3

解決策の 1 つは、共用体を使用することです。ユニオンを使用すると、異なる構造体に同じメモリ領域を使用できます。たとえば、1 つの double と 1 つの構造体を共用体に含めることができます。それらは同じメモリを共有し、そのうちの 1 つしか使用できません。列挙型を使用して、どちらを使用するかを判断できます。

ユニオンは、オブジェクトの使用をよりトリッキーにするため、少しハックです。多くのオブジェクトが同じメモリを共有する可能性があるため、コンパイラはそれらを構築、破棄、またはコピーする方法を知りません。メモリを節約したい場合にこれを行う方法の小さな例を次に示します (わかりました、enum は 4 バイトを使用するため、メモリ効率は良くありませんが、忘れましょう ;)

#include <cstdlib>
#include <iostream>

struct Vector
{
    double x, y, z;
};

struct Element
{
    enum Type { SCALAR, VECTOR };
    Type type;
    union {
        double scalar;
        Vector v;
    } data;
};

int main(void)
{
    Element vector_element;
    vector_element.type = Element::VECTOR;
    vector_element.data.v.x = 1;
    vector_element.data.v.y = 2;
    vector_element.data.v.z = 3;

    Element scalar_element;
    scalar_element.type = Element::SCALAR;
    scalar_element.data.scalar = 3.142;

    std::cout << "The size of type Element without enum would be: " << (sizeof(Element) - sizeof(Element::Type)) << " bytes." << std::endl;

    return EXIT_SUCCESS;
}

ちなみに、これはなぜか28バイトになります。私は 3 * 8 = 24 バイトを期待していました。

于 2010-05-14T17:08:35.803 に答える
1

最も簡単な方法は、スカラーの とベクトルのオブジェクトをOperand含む構造体を作成することです。doubleVector

struct Operand
{
    double scalar_;
    Vector vector_;
    bool isVector_;
};

(isVector_ベクトル オペランドの場合は true、スカラー オペランドの場合は false に設定できます)

実際のスタックについては、単に使用できますstd::stack<Operand>

他のオプションには、継承 (オペランドの基本型から派生したスカラー型とベクトル型の作成) などがありますboost::variantが、このような単純なものの場合、上記のような合成構造体Operandがおそらく最も簡単な方法です。

于 2010-05-14T16:34:01.640 に答える