5

簡単でエレガントな方法で構造体のベクトルを関数に渡す方法を理解するのに苦労しています。コードは次のようになります。

struct cube{ double width; double length; double height; };
vector<cube> myVec;
int myFunc(vector<double> &in)
{
// do something here
}
int test = myFunc(myVec.width); // NOT POSSIBLE

だから私が欲しいのは、幅のベクトルだけを関数に渡して、いくつかの計算を実行することです。これはまったく可能ですか、それとも構造体の完全なベクトルを関数 myFunc() に渡す必要がありますか?

4

3 に答える 3

9

構造体のフィールドの 1 つを使用して計算を実行する場合は myFunc、使用する必要があるフィールドを指定する必要があります。このような:

void myFunc( std::vector< cube > & vect, double cube::*field ) {
    for ( cube & c : vect ) {
        c.*field // <--- do what you want
    }
}
// calling
myFunc( myVect, & cube::width );
myFunc( myVect, & cube::length );
// etc.

ところで、フィールドのタイプが異なっていても、 内の式で使用できますが、テンプレートにすることでmyFunc引き続き使用できます。myFunc

template< typename FieldType >
void myFunc( std::vector< cube > & vect, FieldType cube::*field ) {
    for ( cube & c : vect ) {
        c.*field // <--- do what you want
    }
}
// calling will be similar to the first piece
于 2013-03-28T10:04:36.083 に答える
1

widthベクター内のすべての要素を含む新しいベクターを作成する必要がありますmyVec

あなたはそれを使うことができstd::transformますstd::back_inserter

std::vector<cube> myVec;
std::vector<double> myWidthVector;

std::transform(std::begin(myVec), std::end(myVec),
               std::back_inserter(myWidthVector),
               [](const cube& c) { return c.width; });

myFunc(myWidthVector);
于 2013-03-28T10:01:15.343 に答える
0

myFunc ですでに行っているように、ベクトルを渡す必要があります。ただし、参照を渡しているため、追加のオーバーヘッドは発生しません。関数内で呼び出すことができます

in[position].width;

または類似。

編集: Aloc が指摘したように: 内容を変更しない場合は、const への参照を渡す必要があります。

于 2013-03-28T10:02:41.940 に答える