Is there an equivalent in C++ of PHP's explode() function?
Possible Duplicate:
Splitting a string in C++
在PHP中,explode()函数将把一个字符串和它砍上热情的阵列切割每一元的specified delimiter。。。。。。。 </P >
是有一个标准箱函数在C + +??????? </P >
- 不,但编写自己的实现就足够简单了。
- 来自[boost/algorithm/string.hpp]的boost::split(www.boost.org/doc/html/string_a‌&8203;lgo.html)
- @我想你应该在结束之前回答这个问题
- 有个问题叫做"在C++中分割一个字符串"。它有一些很好的解决方案。
- 下面的答案与php的explode()有几个不同,这里更接近php端口
下面是一个简单的示例实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <string>
#include <vector>
#include <sstream>
#include <utility>
std ::vector<std ::string> explode(std ::string const & s , char delim )
{
std ::vector<std ::string> result ;
std ::istringstream iss (s );
for (std ::string token ; std ::getline(iss , token , delim ); )
{
result .push_back (std ::move(token ));
}
return result ;
} |
用途:
1
| auto v = explode("hello world foo bar", ' '); |
注意:杰瑞对输出迭代器的编写思想对C++更为实用。实际上,您可以同时提供这两种功能:输出迭代器模板和产生向量的包装器,以实现最大的灵活性。
注2:如果要跳过空的令牌,请添加if (!token.empty())。
- 在这种情况下,std::move在做什么?有必要吗?我编译没有它,因为我不使用C++ 11,它做的很好。但是这个案例的目的是什么呢?
- @用户1944429:移动可避免复制字符串数据。由于您在循环中不再使用它,所以向量可以直接"窃取"数据而不复制它。
- 它遗漏了一个案例,在"a、b、c、d"的输入场景中,它应该返回5个值,包括最后一个空值,但它没有返回
- 如果需要我用的东西,爆炸
- @aloksaini:true,当前代码具有"可选的尾随分隔符"语义,而不是您想要的语义。解决这个问题的最简单方法是添加一个检查,如果是s.back() == delim,并在这种情况下发出另一个空字符串。
- 标准库真的应该添加这个方法:vector std::string::spilt(char delimiter = ' ');。
- @医生:艾德赛有一个相当复杂的版本。与您的版本不同,它不假定特定的分配器或输出类型,并且它可以提前停止。
- @Kerreksb的函数有3个已知问题,这里有一个版本有0个已知问题:pastebin.com/ajaevqju-3个问题是:1:php的分隔符是一个字符串,而不是一个字符(尽管支持包含单个字符的字符串),但此函数使用一个字符作为分隔符。2:php的explode的第三个(可选)参数是max split limit,之后字符串中剩余的任何内容(即使它包含分隔符)都将连接到最后一个字符串,但此函数没有第三个参数。3:php将分隔符作为第一个参数,而不是第二个参数(最大注释大小)
标准库不包括直接等效的库,但编写起来相当容易。作为C++,通常不想对数组进行专门的编写——相反,通常您需要将输出写入迭代器,因此它可以进入数组、向量、流等,这将给出一个关于这个一般顺序的东西:
1 2 3 4 5 6 7 8 9
| template <class OutIt >
void explode(std ::string const &input , char sep , OutIt output ) {
std ::istringstream buffer (input );
std ::string temp ;
while (std ::getline(buffer , temp , sep ))
*output ++ = temp ;
} |
- 我相信std::getline呼叫有错误。如果你有input,我想应该是temp。
- @安东尼奥斯:哦,很对。谢谢您!