2012-10-19 80 views
14

可能重複:
Splitting a string in C++在PHP的explode()函數的C++中是否有等價物?

在PHP中,explode()功能將一個字符串,並把它切碎了到一個數組由指定的分隔符分隔每個元件。

在C++中是否有等價函數?

+1

不,但它很容易編寫自己的實現。 –

+1

'boost :: split' from [boost/algorithm/string.hpp](www.boost.org/doc/html/string_algo.html) – Praetorian

+0

@KerrekSB我想你應該在這個關閉之前做出答案 –

回答

28

這裏有一個簡單的例子實現:

#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())

+0

在這種情況下做什麼std :: move?有必要嗎?我編譯沒有它,因爲我沒有使用C++ 11,它沒有問題。但是這種情況下的目的是什麼? –

+4

@ user1944429:此舉避免了複製字符串數據。由於在循環中沒有更多的用途,因此矢量直接「竊取」數據而不復制它是有意義的。 –

+0

它錯過了一個案例,在「a,b,c,d」的輸入場景中, 它應該返回包括最後一個null在內的5個值,但如果需要的話,它不需要 –

11

標準庫不包括直接等價物,但是這是一個相當容易寫的東西。作爲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; 
} 
相關問題