2016-06-29 10 views
0

I Namen struct ist der Typ haben eine Struktur:Was in einem Vektor

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; 
}; 

Nun, wenn ich einen Vektor von wav_file_struct wie folgt zu erstellen:

std::vector<wav_file_struct> v_wav_file_struct; 

Wie gebe ich die Struktur innerhalb wav_file_struct als Parameter für eine Funktion, auf die als Vektor zugegriffen werden kann? Zum Beispiel möchte ich wav_file_info an eine Funktion übergeben, aber als Vektor. Es scheint, dass ich, da es in einem Vektor von wav_file_struct ist, den Vektor wav_file_struct übergeben muss und dann die Funktion Zugriff auf das interne Strukturelement und die Mitglieder innerhalb dieser Strukturen erlangen kann. Richtig?

+1

Es ist wirklich unklar, was Sie hier erreichen wollen. Sie sagen "übergeben Sie wav_file_info an eine Funktion, aber als Vektor", aber wav_file_info ist kein Vektor oder irgendetwas, das einem entfernt ähnelt. Was würdest du mit dem Vektor machen, den du willst? Warum brauchst du einen Vektor? – user2357112

+3

Nicht sicher, wonach Sie suchen. 'wav_file_info' ist kein' Vektor' und kann daher nicht als 'Vektor' verwendet werden. Du könntest ein 'wav_file_info' in einen temporären' Vektor' setzen und dann die Funktion mit diesem 'Vektor' aufrufen, aber ich sehe nicht, was dir das bringt. Mehr Informationen bitte. [Das klingt sehr nach einem X-Y-Problem.] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – user4581301

+0

Lies das zweimal, und immer noch nicht sicher, was es fragt. Vielleicht ist eine Beispielfunktion, an die Sie dies weitergeben möchten, und Ihr Versuch, sie zu übergeben, als * Update für Ihre Frage * in Ordnung. – WhozCraig

Antwort

0

Sie können eine Funktion angeben, die den gesamten Vektor aufnimmt, oder Sie können eine Funktion angeben, die den Elementtyp aufnimmt.

//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) Dies wurde nicht gefragt.2) Das Übergeben von Containern oder komplizierten Klassen nach Wert ist eine teure Operation. Wollen Sie wirklich eine Duplikatkopie eines 10000-Element-Vektors von 'wav_file_struct' machen, nur um es als Parameter an' take_vec() 'zu übergeben, und dann sofort den doppelten Vektor zerstören, wenn er zurückkommt? –

+0

1) OP-Frage fehlt Kohärenz. Eine einfache Erklärung der Parameterübergabe schien hilfreich zu sein, da sie nicht einmal Beispielcode zur Veranschaulichung ihrer Frage erstellten. 2) Eine Referenz wäre wahrscheinlich die richtige Wahl bei einem großen Container, aber sie haben nicht nach Effizienz gefragt. Sie haben eine gewisse Tangens über RAM-Preise gemacht. * Dies wurde nicht gefragt. * –

1

Ihre Schlussfolgerung ist im Allgemeinen richtig. Es gibt keinen Mechanismus, um einen Vektor von Klassen aufzunehmen und ihn in einen Vektor umzuwandeln, der ein bestimmtes Element jeder Klasseninstanz enthält. Nachdem das gesagt wurde:

Es gibt einige Dinge, die getan werden können, wenn Sie die Angewohnheit haben, Vorlagenklassen oder Funktionen zu schreiben, die über eine Iterator-definierte Sequenz arbeiten; anstelle von diskreten Funktionen, die einen ganzen Container als Parameter verwenden.

Angenommen, anstelle einer Funktion, die einen Vektor von wav_file_info nimmt und was auch immer sie damit macht, haben Sie eine Template-Funktion, die ihren Job mit einem Iterator-Anfangswert und einem Iterator-Endwert ausführt.

Dann wird dies eine einfache Aufgabe, einen Wrapper für ein std::vector<wav_file_struct>::iterator definieren, die im Allgemeinen alles von ihrer Oberklasse erbt, die aber definiert seine value_type einen wav_file_info und stellt einen geeigneten Ersatz für operator* und operator->. Problem gelöst. (1)

Diese Art von Ansatz führt zu Code-Blähungen. Aber die RAM-Preise sind in den letzten Jahren gesunken; und wenn das ein Problem wird, gibt es verschiedene andere Dinge, die darüber auch getan werden können.

(1) Nun, es ist technisch nicht notwendig, einen Paradigmenwechsel von der Übergabe eines Containers an die Übergabe eines Iteratorwertes für Anfang und Ende durchzuführen. Sie könnten Ihre Vorlagenfunktion über eine Containerklasse als Parameter verfügen lassen und einen benutzerdefinierten Container-Wrapper bereitstellen, dessen und end() die oben genannten Iterator-Wrapper zurückgeben (und die alle anderen möglicherweise erforderlichen Containermethoden implementieren).