2012-10-19 16 views
14

Możliwe zduplikowane:
Splitting a string in C++Czy istnieje odpowiednik w C++ funkcji explode() PHP?

W PHP funkcja explode() weźmie ciąg i pokroić go w tablicy oddzielając element o określonym separatora.

Czy istnieje odpowiednik funkcji w C++?

+1

Nie, ale napisanie własnej implementacji jest łatwe. –

+1

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

+0

@KerrekSB Myślę, że powinieneś zrobić odpowiedź zanim to się zakończy –

Odpowiedz

28

Oto prosty przykład realizacja:

#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; 
} 

Zastosowanie:

auto v = explode("hello world foo bar", ' '); 

Uwaga: @ idea Jerry pisać do iteratora wyjściowego jest bardziej idiomatycznych do C++. W rzeczywistości możesz podać oba; szablon wyjściowo-iteracyjny i opakowanie generujące wektor, zapewniające maksymalną elastyczność.

Uwaga 2: Jeśli chcesz pominąć puste żetony, dodaj if (!token.empty()).

+0

Co to jest std :: move w tym przypadku? Czy to konieczne? Skompilowałem to bez niego, ponieważ nie używam C++ 11 i wszystko działa dobrze. Ale jaki jest cel w tym przypadku? –

+4

@ user1944429: Ruch nie pozwala kopiować danych ciągu. Ponieważ nie ma już dla niego zastosowania w pętli, ma sens, aby wektor "ukradł" dane bezpośrednio, bez ich kopiowania. –

+0

to pomija przypadek, w scenariuszu wejściowym "a, b, c, d," powinien zwrócić 5 wartości, w tym ostatnią wartość zerową, ale nie trzeba –

11

Standardowa biblioteka nie zawiera bezpośredniego odpowiednika, ale napisanie jej jest dość łatwe. Będąc w C++, zazwyczaj nie chcesz pisać specjalnie do tablicy - raczej typowo chcesz zapisać wynik do iteratora, aby mógł przejść do tablicy, wektora, strumienia itp. coś na tym ogólnym zamówieniu:

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; 
} 
Powiązane problemy