什么是向量内的struct的类型名称

时间:2016-06-29 23:51:36

标签: c++ vector struct nested

我有一个结构:

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

现在,如果我像这样创建一个wav_file_struct的向量:

std::vector<wav_file_struct> v_wav_file_struct;

如何将wav_file_struct中的结构作为参数传递给函数,以便可以作为向量进行访问?例如,我想将wav_file_info传递给函数但是作为向量传递。似乎因为它位于wav_file_struct的向量内,所以我必须传递向量wav_file_struct,然后函数可以访问内部struct成员和这些结构内部的成员。正确的吗?

2 个答案:

答案 0 :(得分:1)

您的结论通常是正确的。没有机制可以获取类的向量,并将其类型转换为包含每个类实例的某个特定成员的向量。话虽如此:

如果您习惯于编写在迭代器定义的序列上运行的模板类或函数,那么可以做一些事情;而不是将整个容器作为参数的离散函数。

假设代替一个带有wav_file_info向量的函数,并对它做了什么,你有一个模板函数,它在给定一个开始迭代器值和一个结束迭代器值的情况下执行它的工作。

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

这种方法确实会导致代码膨胀。但是,RAM价格在过去几年中一直在下降;如果这成为一个问题,那么也可以采取其他各种措施。

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

答案 1 :(得分: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]);
}