首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有个小疑点问一下大家,关于std:string快速枚举的

2013-12-06 
有个小问题问一下大家,关于std::string快速枚举的比如我这里需要匹配一系列的字符串:mp4、avi、mpeg3、mpeg4、

有个小问题问一下大家,关于std::string快速枚举的
比如我这里需要匹配一系列的字符串:mp4、avi、mpeg3、mpeg4、3gp、mov、flv、f4v、ts、m4a

我要在得到文件名后缀之后,比如1.avi我得到了avi,那么我怎样知道他在上面的集合中?如果不在我就让他去匹配图片类型的集合。

怎样能更快速一些?用map比普通的字符串匹配要快,但是已经是最快的了么?


分数略少,求帮助啊!


用map也只是想法,晚上再来写测试代码。。
[解决办法]
C++的map和set底下其实是一样的。
[解决办法]
LZ怎就觉得用map和set会慢呢?
[解决办法]
map不是有个find方法么?

先用标准库的东西,性能不会太差。
[解决办法]
就那么几个而已, 直接if-else判断吧。 
[解决办法]
貌似可以用hash_map
[解决办法]

引用:
Quote: 引用:

就那么几个而已, 直接if-else判断吧。 

用if,else以后扩展不好扩,还不如直接find 或者匹配key 然后break呢

别轻易下结论。 

enum media_type
{
   mp3,
   mp4,
   media_type_cnt
};
#define unkown_type (enum media_type)-1;
enum media_type convert(char const* type);
void play(char const* fn, enum media_type);

int main()
{
  enum media_type type = convert("mp3");
  play("helloworld.mp3",type); 
  return 0;
}
//增加新类型是记得更新这个表
static char const* types[] = {"mp3", "mp4"};
enum media_type convert(char const* type)
{
  enum media_type i = 0;
  for(; i < media_type_cnt; ++i)
  {
     if(strcmp(types[i], type) == 0)
     {
        return i;
     }
  }
  return unkown_type;
}

void play(char const* fn, enum media_type type)
{
   //...
}

[解决办法]
先根据第一个字母或者2个字母switch case,再strcmp比较。
[解决办法]
引用:
后来在看了一下代码觉得前面部分,貌似是多余的;而且枚举和int的转换,vs编译不能通过,试过08、10、12、13版本的

昨晚没细看,以为是只用enum类型,原来还是匹配字符串的方式。


1. 不管你用什么方法都避免不了字符串的遍历:使用hash也是从char*->int, map,set等用的就是字符串匹配。 鉴于你的媒体类型不会太多,直接用逐个匹配就好了。  
2. 通不过编译的问题,稍加修改就好。 

#include <cstring>
enum media_type
{
mp3,
mp4,
media_type_cnt
};
#define unkown_type (enum media_type)-1;

enum media_type convert(char const* type);
void play(char const* fn, enum media_type);

int main()
{
enum media_type type = convert("mp3");
play("helloworld.mp3", type);
return 0;
}
//增加新类型是记得更新这个表
static char const* types[] = { "mp3", "mp4" };
enum media_type convert(char const* type)
{
int i = 0;
for (; i < media_type_cnt; ++i)
{
if (strcmp(types[i], type) == 0)
{
return (enum media_type)i;
}
}
return unkown_type;
}

void play(char const* fn, enum media_type type)
{
//...
}

热点排行