vector中struct的类型名是什么?

What is type name of struct inside a vector

本文关键字:是什么 类型 struct vector      更新时间:2023-10-16

我有一个结构体:

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,然后函数可以访问内部结构成员和这些结构内部的成员。正确吗?

你的结论大体上是正确的。没有任何机制可以接受类的向量,并将其类型转换为包含每个类实例的特定成员的向量。话虽如此:

如果你养成了在迭代器定义的序列上操作模板类或函数的习惯,有一些事情是可以做的;而不是将整个容器作为参数的离散函数。

假设你有一个模板函数,在给定开始迭代器值和结束迭代器值的情况下执行它的任务,而不是一个接受wav_file_info的向量并对其进行处理的函数。

然后,这就变成了为std::vector<wav_file_struct>::iterator定义包装器的简单任务,该包装器通常继承其超类的所有内容,但将其value_type定义为wav_file_info,并为operator*operator->提供合适的替代品。问题解决了。(1)

这种方法会导致代码膨胀。但是,在过去的几年里,RAM的价格一直在下降;如果这成为一个问题,还有很多其他的事情可以做。

(1)从技术上讲,没有必要经历从传递容器到传递开始和结束迭代器值的范式转换。您可以让模板函数有一个容器类作为参数,并提供一个自定义容器包装器,其begin()end()返回上述迭代器包装器(并实现可能需要的任何其他容器方法)。

可以指定接收整个向量的函数,也可以指定接收元素类型的函数。

//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]);
}