使用单个字符或仅一个字符串来提升拆分

时间:2011-04-18 07:06:34

标签: c++ string boost

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

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

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

这种方法不会真正适用于多个令牌,因为迭代意味着逐字逐句。我不知道该库足以提供预构建的替代方案,但您可以在split_iterators

之上实现该功能