我刚读了一些使用建议
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
而不是
if( s == t )
{
我几乎总是使用最后一个,因为我习惯了它,它感觉更自然,更可读。我甚至不知道还有一个单独的比较函数。
更准确地说,我认为==将调用compare()。
有什么不同?在哪些情况下,一种方式比另一种方式更受青睐?
我只考虑需要知道一个字符串是否与另一个字符串的值相同的情况。
Std::string::compare()返回一个int类型:
如果s和t相等,它等于0,
如果s小于t,则小于0,
如果s大于t,则大于0。
如果你想让你的第一个代码片段与第二个代码片段等效,它实际上应该是:
if (!s.compare(t)) {
// 's' and 't' are equal.
}
相等运算符仅测试是否相等(因此得名)并返回bool类型。
要详细说明用例,如果您感兴趣的是,当两个字符串恰好不同时,它们是如何相互关联的(更小或更大),那么compare()可能很有用。PlasmaHH正确地提到了树,它也可以是,比如说,一个旨在保持容器排序的字符串插入算法,一个上述容器的二分搜索算法,等等。
编辑:正如Steve Jessop在评论中指出的那样,compare()对于快速排序和二进制搜索算法最有用。自然排序和二分搜索只能用std::less实现。
这里没有涉及到的一件事是,它取决于我们是比较string与c string, c string与string,还是string与string。
一个主要的区别是,比较两个字符串时,在进行比较之前检查大小是否相等,这使得==操作符比比较操作符更快。
这是比较,因为我看到它在g++ Debian 7
// operator ==
/**
* @brief Test equivalence of two strings.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __lhs.compare(__rhs) == 0; }
template<typename _CharT>
inline
typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
operator==(const basic_string<_CharT>& __lhs,
const basic_string<_CharT>& __rhs)
{ return (__lhs.size() == __rhs.size()
&& !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
__lhs.size())); }
/**
* @brief Test equivalence of C string and string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) == 0; }
/**
* @brief Test equivalence of string and C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) == 0; }