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&lt;std::string, boost::function&gt; StringSwitch;

这让你说StringSwitch["Some string"](arguments...)

【讨论】:

【参考方案5】:

这些都不是你想要的......因为我假设你想使用 std::string::compare 函数进行字符串比较

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于STL 向量比较问题的主要内容,如果未能解决你的问题,请参考以下文章

STL 向量:移动向量的所有元素

是否需要清除 STL 向量

减少 stl 向量的容量

C++ STL 中向量的恒定时间交换逻辑

C++:问题向量 STL

动态数组与 STL 向量的确切区别?