今天在分析amr解码时,发现用到了vector和list。考虑到这两种容器类使用的场景很多,想把他们的使用方法分享给读者。所以我单独抽离一部分单独编译,具体代码如下:
#include <stdio.h> #include <stdlib.h> #include <vector> #include <list> #include <unistd.h> typedef unsigned char uint8_t; #define AMR_CMR_BITS 4 #define AMR_BE_TOC_BITS 6 #define FT_NODATA 15 enum AMR_CLASS{ AMR_CLASS_NONE, AMR = 1, AMR_WB }; enum AMR_MODE{ AMR_MODE_NONE, BE = 1, OA }; // BE: bindwidth-efficient, OA: octet-align typedef union be_toc_entry { uint8_t v; struct { uint8_t q:1; uint8_t ft:4; uint8_t nl:1; // not_last flag, 0: last frame, 1: not last uint8_t r:2; // reserved }; }be_toc_entry_t; class AmrFrameData { public: AmrFrameData( uint8_t ft = FT_NODATA, uint8_t q = 1 ): frame_type(ft), quality(q){ } public: uint8_t frame_type; uint8_t quality; // data[0] is frame header for amr file, data[1] and remain bytes are core frame data std::vector<uint8_t> data; }; void testvector() { std::vector<AmrFrameData> frame_data_list; std::list<AmrFrameData *> fdata_ptr_list; // not used when construct frame_data_list.resize(1); be_toc_entry_t entry; std::vector<AmrFrameData>::iterator it = frame_data_list.begin(); int l = 0; uint8_t v = 1; do { // multiple AMR frames in one RTP payload, this may happens rarely if ( it == frame_data_list.end() ) { frame_data_list.resize( frame_data_list.size() + 1 ); it = frame_data_list.end() - 1; } it->data.resize(10); it->data[0]=0; uint8_t *p = &it->data[1]; for(int j=0;j<9;j++) { *p=0; p++; } it->frame_type = v; it->quality = v; it++; l++; } while ( l < 10 ); std::vector<AmrFrameData>::iterator fdata_it; for ( fdata_it = frame_data_list.begin(); fdata_it != frame_data_list.end(); fdata_it++ ) fdata_ptr_list.push_back(&*fdata_it); fdata_ptr_list.clear(); frame_data_list.clear(); } int main() { char g = 0; do { testvector(); //g = getchar(); //printf('g=%c\n',g); //cout >> g; usleep(1000); }while (g!='q'); }
将这些代码复制到文本文件中,文件命名韦testvector.c。然后用g++ testvector.c -o testvector 可以完成编译。
vector的使用相关方法有:
std::vector<AmrFrameData>::iterator it = frame_data_list.begin(); frame_data_list.resize( frame_data_list.size() + 1 ); for ( fdata_it = frame_data_list.begin(); fdata_it != frame_data_list.end(); fdata_it++ ) fdata_ptr_list.push_back(&*fdata_it);
list的使用相关方法有:
fdata_ptr_list.push_back(&*fdata_it); fdata_ptr_list.clear()