STL向量比较问题

4

如果定义了一个向量为std::vector<std::string>,你可能会想知道以下代码为什么是有效的:

if ( vecMetaData[0] != "Some string" ) 
{
    ...

但不是这个:

switch ( vecMetaData[1] )
{
    ...

Visual studio 抱怨:


error C2450: switch expression of type 'std::basic_string<_Elem,_Traits,_Ax>' is illegal
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>,
1>            _Ax=std::allocator<char>
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
6个回答

15

switch()需要一个整型类型(例如int、char等)

字符串不是整型类型,也没有隐式转换为整型类型,因此不能在switch语句中使用。


3

这是有效的,因为第一个调用了std::string的operator!=函数,该函数接受const char*作为参数。然而,这并不意味着std::string也有一个返回整数表达式的operator some_integral_type()函数,switch语句需要使用。

C++中使用运算符不一定会调用内置含义。例如,您的代码没有比较指针值。它可能会调用用户定义的(在本例中是std::string的)运算符函数。


2
您只能使用 switch 语句处理基本数据类型(如 int、char 等)。

1

最简单的替代方法是使用 std::map<std::string, boost::function> StringSwitch;

这样你就可以这样说 StringSwitch["某个字符串"](参数...)


1

如果您只想检查向量中的每个元素,可以使用for_each标准库函数。或者,如果您想对可能值的子集进行操作,请使用find_if获取匹配项的迭代器,然后使用循环或for_each对它们进行操作。


1

这两个可能都不是你想要的...因为我猜你想使用std::string::compare函数进行字符串比较


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接