Boost拆分使用单个字符或仅一个字符串

boost split with a single character or just one string

本文关键字:字符串 一个 拆分 单个 字符 Boost      更新时间:2023-10-16

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

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

对于与字符串匹配,我不知道该使用什么语法。我不想构造一个正则表达式;一些简单的语法,如split(vec,str,match_str("::")将是好的。

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

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

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

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

在下面的代码中,为了简单起见,让我假设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("::"));

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

该方法实际上不适用于多个标记,因为迭代意味着逐个字符地进行迭代。我不太了解这个库,无法提供预构建的替代方案,但您可以在split_iterator s

之上实现该功能。
相关文章: