web-dev-qa-db-fra.com

Existe-t-il un équivalent en C ++ de la fonction explode () de PHP?

Duplicata possible:
Fractionnement d'une chaîne en C++

En PHP, la fonction explode() prendra une chaîne et la découpera en un tableau séparant chaque élément par un délimiteur spécifié.

Existe-t-il une fonction équivalente en C++?

19
reformed

Voici un exemple d'implémentation simple:

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

Usage:

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

Remarque: L'idée de Jerry d'écrire dans un itérateur de sortie est plus idiomatique pour C++. En fait, vous pouvez fournir les deux; un modèle d'itérateur de sortie et un wrapper qui produit un vecteur, pour une flexibilité maximale.

Remarque 2: Si vous souhaitez ignorer les jetons vides, ajoutez if (!token.empty()).

32
Kerrek SB

La bibliothèque standard n'inclut pas d'équivalent direct, mais elle est assez facile à écrire. En tant que C++, vous ne voulez normalement pas écrire spécifiquement dans un tableau - plutôt, vous voudriez généralement écrire la sortie dans un itérateur, afin qu'elle puisse aller dans un tableau, un vecteur, un flux, etc. Cela donnerait quelque chose sur cet ordre général:

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;
}
11
Jerry Coffin