读书人

有个小疑点问一下大家关于std:strin

发布时间: 2013-12-06 17:56:43 作者: rapoo

有个小问题问一下大家,关于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)
{
//...
}

读书人网 >C++

热点推荐