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++?
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++?
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())
.
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? –
@ 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. –
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 –
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;
}
Nie, ale napisanie własnej implementacji jest łatwe. –
'boost :: split' z [boost/algorithm/string.hpp] (www.boost.org/doc/html/string_algo.html) – Praetorian
@KerrekSB Myślę, że powinieneś zrobić odpowiedź zanim to się zakończy –