在PHP中,explode()
功能將一個字符串,並把它切碎了到一個數組由指定的分隔符分隔每個元件。
在C++中是否有等價函數?
在PHP中,explode()
功能將一個字符串,並把它切碎了到一個數組由指定的分隔符分隔每個元件。
在C++中是否有等價函數?
這裏有一個簡單的例子實現:
#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;
}
用法:
auto v = explode("hello world foo bar", ' ');
注:@寫入輸出迭代器的傑裏的想法是對C更地道++。事實上,你可以同時提供;一個輸出迭代器模板和一個產生矢量的包裝器,以實現最大的靈活性。
注2:如果您想跳過空標記,請添加if (!token.empty())
。
在這種情況下做什麼std :: move?有必要嗎?我編譯沒有它,因爲我沒有使用C++ 11,它沒有問題。但是這種情況下的目的是什麼? –
@ user1944429:此舉避免了複製字符串數據。由於在循環中沒有更多的用途,因此矢量直接「竊取」數據而不復制它是有意義的。 –
它錯過了一個案例,在「a,b,c,d」的輸入場景中, 它應該返回包括最後一個null在內的5個值,但如果需要的話,它不需要 –
標準庫不包括直接等價物,但是這是一個相當容易寫的東西。作爲C++,你通常不希望專門寫一個數組 - 但是,你通常希望將輸出寫入一個迭代器,所以它可以轉到數組,矢量,流等。這會給這個一般命令的東西:
template <class OutIt>
void explode(std::string const &input, char sep, OutIt output) {
std::istringstream buffer(input);
std::string temp;
while (std::getline(buffer, input, sep))
*output++ = temp;
}
不,但它很容易編寫自己的實現。 –
'boost :: split' from [boost/algorithm/string.hpp](www.boost.org/doc/html/string_algo.html) – Praetorian
@KerrekSB我想你應該在這個關閉之前做出答案 –