返回首页

简介
分割使用一个给定的分隔符的字符串是一个非常常见的操作。
不幸的是,STL没有提供任何直接的方式实现这一目标。
这种分裂实施templatised和使用类型推演,以确定什么样的字符串和容器作为参数,这必须是某种形式的basic_stringlt; GT;和任何容器实现push_back()方法被传递。
可直接进入的文件,它是用来放置代码,或创建一个单独的包括文件。
注意,未完全指定的字符串类型,允许的特点和分配器为默认。
在某些情况下,这可能不是你想要的,有些编译器可能不喜欢它。背景
我写这篇时,我发现,公司的Paul J. Weiss编写的代码与标题比我为这个共同的简单的情况下需要更复杂的。
最常见的情况应该是最容易写的。源代码

template <typename E, typename C>

size_t split(std::basic_string<E> const& s,

             C &container,

             E const delimiter,

             bool keepBlankFields = true)

{

    size_t n = 0;

    std::basic_string<E>::const_iterator it = s.begin(), end = s.end(), first;

    for (first = it; it != end; ++it)

    {

        // Examine each character and if it matches the delimiter

        if (delimiter == *it)

        {

            if (keepBlankFields || first != it)

            {

                // extract the current field from the string and

                // append the current field to the given container

                container.push_back(std::basic_string<E>(first, it));

                ++n;

                

                // skip the delimiter

                first = it + 1;

            }

            else

            {

                ++first;

            }

        }

    }

    if (keepBlankFields || first != it)

    {

        // extract the last field from the string and

        // append the last field to the given container

        container.push_back(std::basic_string<E>(first, it));

        ++n;

    }

    return n;

}

用法示例{C}

回答

评论会员:scmeiqy 时间:2011/12/14
你的代码不能在GCC 4.40编译,但它可以在VS2005编译
评论会员:巴勃罗Aliskevicius 时间:2011/12/14
g编译器需要在前面的typename的使用为const_iterator声明。
这大概是现在的标准要求,但我还没有机会去看看。

保持简单
DEX
评论会员:Gast128 时间:2011/12/14
没错。克现在实现了标准要求,合格的依赖类型作为非类型分析,除非它们是用"typename的"关键字前缀。

保持简单
DEX
评论会员:加思J兰卡斯特 时间:2011/12/14
首先,感谢您的共享,并抽出时间来写了一篇文章,并将其发布

如果让我建议的修改,我注意到,你在你的函数中使用push_back。一些容器(比如std::设置)不支持push_back:传递一个输出迭代器(喜欢它的性病:副本)可以使代码更加有用

见:
http://www.sgi.com/tech/stl/set.html
http://www.sgi.com/tech/stl/insert_iterator.html
http://www.sgi.com/tech/stl/copy.html



巴勃罗
评论会员:Gast128 时间:2011/12/14
谢谢巴勃罗
"我认为,设计,但选择您所描述的明确限制。
由此产生的客户端代码获取丑陋的原因是,我选择了这一个给定的版本。

现在有人曾建议,但,我已经实现了它。
很少有变化的需要。
更改容器类型C OI和重命名容器outIt

模板LT; TYPENAME OIgt TYPENAME E,
为size_t分裂(STD::basic_stringlt; EGT; constamp;,
其他投资放大器; outIt,

然后改变行push_back
(第一);
* outIt = STD:basic_stringlt; EGT;
在两个地方,你就大功告成了!







保持简单
DEX
评论会员:虚拟编码器 时间:2011/12/14
尼斯尝试,但已通过提高覆盖:分裂(...).但也许意向只是与算法实验。
评论会员:Gast128 时间:2011/12/14
Gast128写道:已通过提高覆盖:分裂(...).

也许 - 但刺激是相当沉重的是不是它 - 你来建设的bjam等它 - 似乎它使意识是否尽一切他们LIBS的刺激方式,但到加装一些,是不是与提高建{BR?? }
"G"
评论会员:斯蒂芬休伊特 时间:2011/12/14
字符串算法完全是基于模板的,如字符串序列和范围的概念作品。有Boost库需要DLL的兴建(如正则表达式,文件系统,序列化,程序选项),但如果你不需要他们,你不使用它们。
评论会员:斯蒂芬休伊特 时间:2011/12/14
Gast128写道:字符串算法是完全模板基于

是的,升压的问题。 {S0}
评论会员:斯蒂芬休伊特 时间:2011/12/14
我没想到这样一个快速反应
谢谢你的意见。
这样做的目的是保持紧密STL内,最常见的任务,尽可能简单。提升往往是优秀的,但患有太过度紧张和理论驱动的触摸偶尔。

保持简单。