複数のデータ型のためのC ++スタック(RPNベクトル算出部)

StackOverflow https://stackoverflow.com/questions/2835847

  •  26-09-2019
  •  | 
  •  

質問

私はC ++で迅速かつ基本的なベクトル演算ライブラリを設計しました。私は、迅速なクロス積、あるいはベクトル間の角度を必要とするとき、私は、コマンドラインからプログラムを呼び出します。起動時間が計算時間よりも大きくなっているので、私は、Matlabのか、オクターブまたは関連を使用しないでください。繰り返しますが、これは非常に基本的な操作のためのものです。

私はこのプログラムを拡張しています、と私はそれがタイプの操作のために、RPN電卓として働くようになります。

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

(1つのベクトル、別のベクター、および「交差」演算子を与える。外積吐き出す)を

スタックのような操作のために、3Dベクトルまたはスカラーを受け入れなければなりません

1 2 3
2
*
out: 2 4 6
このミニ電卓のための

レクサーとパーサは簡単ですが、私は内部スタックを作成するための良い方法を考えるように見えることはできません。どのようにあなたは(私は私自身の非常に単純なベクトルのクラスをロールアップ - 未満百行と、それはすべてのIの必要性をする)ベクターまたはダブルスを収容するためのスタックを作成することになります。

どのように私はクラスのベクトルの要素を受け入れるか、二重入力の簡単なスタックを作成することができますか?

ありがとうございます。

役に立ちましたか?

解決

は最も簡単な方法は、単にスカラーとベクトルのOperandオブジェクトのdoubleが含まれているVector構造体を作成することです

struct Operand
{
    double scalar_;
    Vector vector_;
    bool isVector_;
};
(それはベクトルオペランド、および偽であれば、それはスカラオペランドである場合はtrueにisVector_を設定することができます)。

実際のスタックの場合、あなただけのstd::stack<Operand>を使用することができます。

他のオプションは、継承(作成スカラーとベクトル型は、オペランド基本型から派生)またはboost::variantのようなものが含まれていますが、このような何かのシンプルなため、上記のようOperand様組成物構造体は、おそらくそれを行うための最も簡単な方法です。

他のヒント

一つの解決策は、共用体を使用することです。労働組合を使用すると、別の構造体のために同じメモリ領域を使用することができます。たとえば、組合内の1つのダブルと1の構造体を持つことができます。彼らは、同じメモリを共有し、あなただけのそれらのいずれかを使用することができます。あなたが使用する1伝えるためにいくつか列挙型を使用することができます。

彼らは、オブジェクトのトリッキーの使用状況を作るために

労働組合は、ビットのハックです。多くのオブジェクトが同じメモリを共有する可能性があるため、コンパイラは、それらを構築する方法を知っている、破壊またはコピーされません。ここで私はメモリを節約したい場合、私はこれを行うだろうか少し例がある(大丈夫、列挙型は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バイトを期待します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top