【问题标题】:boost split with a single character or just one string使用单个字符或仅一个字符串来提升拆分
【发布时间】:2011-04-18 07:06:33
【问题描述】:

我希望将字符串拆分为单个字符或字符串。我想使用boost::split,因为 boost 字符串是我们基本字符串处理的标准(我不想混合几种技术)。

在单个字符的情况下,我可以使用split(vec,str,is_any_of(':')),但我想知道是否有办法只指定单个字符。它可能会提高性能,但更重要的是,我认为仅使用一个字符代码会更清晰,因为 is_any_of 传达了与我想要的不同的含义。

为了匹配一个字符串,我不知道使用什么语法。我不想构建一个正则表达式;像split(vec,str,match_str("::") 这样的简单语法会很好。

【问题讨论】:

    标签: c++ string boost


    【解决方案1】:

    我一直在寻找相同的答案,但找不到。最后,我设法自己制作了一个。

    您可以使用std::equal_to 来构成您需要的谓词。这是一个例子:

    boost::split(container, str, std::bind1st(std::equal_to<char>(), ','));
    

    当我需要使用单个字符拆分字符串时,我就是这样做的。

    【讨论】:

      【解决方案2】:

      在下面的代码中,为简洁起见,让我假设using namespace boost
      至于按字符分割,如果只允许algorithm/stringis_from_range 可能达到目的:

      split(vec,str, is_from_range(':',':'));
      

      或者,如果允许lambda

      split(vec,str, lambda::_1 == ':');
      

      或者如果允许准备一个专用谓词:

      struct match_char {
        char c;
        match_char(char c) : c(c) {}
        bool operator()(char x) const { return x == c; }
      };
      
      split(vec,str, match_char(':'));
      

      至于匹配字符串,正如 David Rodri'guez 提到的, split 似乎没有办法。 如果iter_split是允许的,大概下面的代码就可以达到目的:

      iter_split(vec,str, first_finder("::"));
      

      【讨论】:

      • C++11 答案:[](char c){ return c==':'} 即原生 lambda。
      • MSalters 优秀评论中的小问题:缺少分号:[](char c){ return c==':';}
      【解决方案3】:

      简单来说,我会留下is_any_of,因为很容易理解is_any_of( single_option ) 的含义。如果你真的想改变它,第三个元素是函子,所以你可以将equals函子传递给split函数。

      这种方法实际上不适用于多个标记,因为迭代意味着逐个字符。我对库的了解不足以提供预构建的替代方案,但您可以在 split_iterators

      之上实现该功能

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多