只有字符串中的空格find_first_not_of()vs find_last_not_of()

时间:2015-11-20 09:43:26

标签: c++ whitespace

我想检查wstring是否只包含空格(准确地说:“\ t \ r \ n”)。我找到了几种使用find_last_not_of()方法的解决方案。

我对这个方法有2个问题:

  1. 当我知道在wstring包含非空白字符的情况下,这些字符将位于字符串的开头,如果我使用{{1}则不会更好因为它一发现就会返回?

  2. 两种方法都有O(n)的复杂性,或者我错了吗?

  3. 我知道网上有很多关于这些方法的信息,但我发现这个主题有些矛盾。

1 个答案:

答案 0 :(得分:1)

实现std::basic_string::find_last_not_of的方式不是规范的一部分;因此,我们不能说这些字符是以自然顺序还是反向顺序查找的。

因此,

  1. 实现相关
  2. 实现相关
  3. 让我们来看看libstdc++'s implementation of std::basic_string::find_last_not_of(basic_string.tcc):

    1317   template<typename _CharT, typename _Traits, typename _Alloc>
    1318     typename basic_string<_CharT, _Traits, _Alloc>::size_type
    1319     basic_string<_CharT, _Traits, _Alloc>::
    1320     find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
    1321     {
    1322       __glibcxx_requires_string_len(__s, __n);
    1323       size_type __size = this->size();
    1324       if (__size)
    1325    {
    1326      if (--__size > __pos)
    1327        __size = __pos;
    1328      do
    1329        {
    1330          if (!traits_type::find(__s, __n, _M_data()[__size]))
    1331            return __size;
    1332        }
    1333      while (__size--);
    1334    }
    1335       return npos;
    1336     }
    

    正如人们猜测的那样,字符串向后查找。在您的具体情况下,std::basic_string::find_first_not_of应该是最佳选择。