STL 向量比较问题
Posted
技术标签:
【中文标题】STL 向量比较问题【英文标题】:STL Vector comparison issue 【发布时间】:2008-11-21 12:30:54 【问题描述】:向量定义为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
【问题讨论】:
【参考方案1】:switch() 需要一个整数类型(如 int、char、...)
string 不是整数类型,string 也没有隐式转换为整数类型,所以不能在 switch 语句中使用
【讨论】:
【参考方案2】:这是有效的,因为第一个将调用 std::string 的 operator!=,它将接受 const char* 作为参数。然而,这并不意味着 std::string 也有一个运算符 some_integral_type() 会返回一个 switch 需要的整数表达式。
在 C++ 中使用运算符不必调用内置含义。例如,您的代码不会比较指针值。它可能会调用用户定义的(在本例中为 std::string 之一)运算符函数。
【讨论】:
【参考方案3】:您只能对基本数据类型(int、char 等)使用 switch。
【讨论】:
【参考方案4】:顺便说一句,最简单的替代方法是std::map<std::string, boost::function> StringSwitch;
这让你说StringSwitch["Some string"](arguments...)
【讨论】:
【参考方案5】:这些都不是你想要的......因为我假设你想使用 std::string::compare 函数进行字符串比较
【讨论】:
【参考方案6】:如果您只想检查向量中的每一项,可以使用for_each
标准库函数。或者,如果您想对可能值的子集进行操作,请使用 find_if
获取匹配项的迭代器,然后使用循环或 for_each
对其进行操作。
【讨论】:
以上是关于STL 向量比较问题的主要内容,如果未能解决你的问题,请参考以下文章