web-dev-qa-db-fra.com

Jetons fractionnés multiples utilisant boost :: is_any_of

Je ne sais pas comment utiliser boost::is_any_of pour diviser une chaîne en utilisant un ensemble de caractères, dont l'un doit diviser la chaîne.

Je voulais faire quelque chose comme ça car j'ai compris que la fonction is_any_of prend un paramètre Set.

std::string s_line = line = "Please, split|this    string";

std::set<std::string> delims;
delims.insert("\t");
delims.insert(",");
delims.insert("|");

std::vector<std::string> line_parts;
boost::split ( line_parts, s_line, boost::is_any_of(delims));

Cependant, cela produit une liste d'erreurs boost/STD. Dois-je persister avec is_any_of ou existe-t-il une meilleure façon de le faire, par exemple. en utilisant un regex split?

26
Pete

Vous devez essayer ceci:

boost::split(line_parts, s_line, boost::is_any_of("\t,|"));
31
Karl von Moor

Votre première ligne n'est pas une syntaxe C++ valide sans une variable préexistante nommée line et boost::is_any_of ne prend pas de std::set comme paramètre constructeur.

#include <string>
#include <set>
#include <vector>
#include <iterator>
#include <iostream>
#include <boost/algorithm/string.hpp>

int main()
{
    std::string s_line = "Please, split|this\tstring";
    std::string delims = "\t,|";

    std::vector<std::string> line_parts;
    boost::split(line_parts, s_line, boost::is_any_of(delims));

    std::copy(
        line_parts.begin(),
        line_parts.end(),
        std::ostream_iterator<std::string>(std::cout, "/")
    );

    // output: `Please/ split/this/string/`
}
9

Le principal problème est que boost::is_any_of prend un std::string ou un char* comme paramètre. Pas un std::set<std::string>.

Vous devez définir delims comme std::string delims = "\t,|" et cela fonctionnera.

2
Matthieu M.