2016-06-29 4 views
0

内の構造体の名前を入力している私は、構造体を持っている:私はこのようなwav_file_structのベクトル作成する場合ベクトル

struct wav_file_info_struct 
{ 
    char filename[MAX_PATH];   
    WORD audio_format; 
    WORD num_channels; 
    DWORD sample_rate; 
    DWORD bits_per_sample; 
}; 

struct wav_file_data_struct 
{ 
    DWORD data_chunk_size; 
    char* wav_data; 
}; 

struct wav_file_struct 
{ 
    wav_file_info_struct wav_file_info; 
    wav_file_data_struct wav_file_data; 
}; 

は今:

std::vector<wav_file_struct> v_wav_file_struct; 

をどのように私はwav_file_struct内の構造体を渡しますベクトルとしてアクセスできるように関数のパラメータとして使用するか?たとえば、関数にwav_file_infoを渡したいのですが、ベクトルとして渡したいとします。それはwav_file_structのベクトルの内部にあるので、私はベクトルwav_file_structを渡さなければならないと思われ、関数は内部構造体メンバとそれらの構造体の内部のメンバにアクセスできます。正しい?

+1

あなたがここで達成しようとしていることは本当に不明です。あなたは "wav_file_infoを関数に渡してベクトルに渡す"と言っていますが、wav_file_infoはベクトルやそれに似ているベクトルではありません。あなたが望むベクトルで何をしますか?なぜベクターが必要なのですか? – user2357112

+3

あなたが何をしているかわからない'wav_file_info'は' vector'ではないので 'vector'として使うことはできません。あなたは 'wav_file_info'を一時的な' vector'に入れ、この 'vector'で関数を呼び出すことができますが、何が得られるのか分かりません。より多くの情報をお願いします。 [これはX-Y問題に非常によく似ています。](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – user4581301

+0

これを2度読んで、それが何を求めているのかまだ分かりません。おそらくこれを渡したいサンプル関数とそれを渡そうとする試みは、あなたの質問に*更新されます。 – WhozCraig

答えて

0

ベクトル全体を取り込む関数を指定することも、要素タイプで使用する関数を指定することもできます。

//function that takes the vector 
void take_vec(std::vector<wav_file_struct> vec){} 

//function that takes an element 
void take_element(wav_file_struct element){} 

int main(){ 

    //create a vector 
    std::vector<wav_file_struct> vec; 
    vec.emplace_back(); 

    //pass in the entire vector 
    take_vec(vec); 

    //pass in an element 
    take_element(vec[0]); 
} 
+0

1)これは尋ねられたものではありませんでした。2)コンテナや複雑なクラスを値渡しするのは高価な操作です。あなたは本当に 'wav_file_struct'の10000要素ベクトルのコピーを作成し、それを' take_vec() 'のパラメータとして渡して、それが返ってくると直ちに破壊しようとしますか? –

+0

1)OPの質問には一貫性が欠けています。パラメータの受け渡しについての簡単な説明は、質問を説明するのに役立つサンプルコードを作成していないため、参考になりました。 2)大型コンテナがあれば、おそらく参照は正しい選択だろうが、効率について質問しなかった。あなたは、RAM価格についていくらかの接線を踏んでいました。 *これは尋ねられたものではありません。* –

1

あなたの結論は一般的に正しいです。クラスのベクトルを取り、それを各クラスインスタンスの特定のメンバを含むベクトルに型変換するメカニズムはありません。あなたがイテレータ定義のシーケンスで動作するテンプレートクラスや関数を書く癖がある場合、いくつかのことができます。コンテナ全体をパラメータとして扱う離散関数ではなく、

wav_file_infoのベクトルを受け取り、それが何をするかを決める関数の代わりに、開始イテレータ値と終了イテレータ値を指定してジョブを実行するテンプレート関数があるとします。

そして、これは一般に、そのスーパークラスからのすべてを継承std::vector<wav_file_struct>::iteratorのラッパーを定義する簡単な作業となるが、そのvalue_typewav_file_infoように定義し、operator*operator->に適した置換を提供します。問題が解決しました。 (1)

このようなアプローチによってコードが肥大化します。しかし、RAMの価格は過去2〜3年で低下している。それが懸念されるならば、それについても実行できる他のさまざまなことがあります。

(1)まあ、技術的には、コンテナを渡すことから、最初と最後のイテレータ値を渡すというパラダイムシフトを受ける必要はありません。テンプレート関数にパラメータとしてコンテナクラスを持たせ、上記のイテレータラッパーを返す(と他​​のコンテナメソッドを実装している)begin()end()を持つカスタムコンテナラッパーを用意することができます。