La fonction boost::split en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction boost::split pour tokeniser la chaîne donnée
  2. Utilisez stringstream avec la fonction getline pour diviser la chaîne avec des délimiteurs
La fonction boost::split en C++

Cet article montrera comment utiliser la fonction boost::split en C++.

Utilisez la fonction boost::split pour tokeniser la chaîne donnée

Boost fournit des outils puissants pour étendre la bibliothèque standard C++ avec des bibliothèques matures et bien testées. Cet article explore la fonction boost::split, qui fait partie de la bibliothèque d’algorithmes de chaîne Boost. Ce dernier comprend plusieurs algorithmes de manipulation de chaînes comme le rognage, le remplacement, etc.

La fonction boost::split divise la séquence de chaînes donnée en jetons séparés par le délimiteur. L’utilisateur doit fournir une fonction de prédicat qui identifie le délimiteur comme troisième paramètre. La fonction fournie doit retourner true si l’élément donné est un délimiteur.

Dans l’exemple suivant, nous spécifions un objet fonction isspace pour identifier les espaces dans le texte donné et les diviser en jetons. boost::split a également besoin d’un conteneur de séquence de destination pour stocker les sous-chaînes tokenisées. Notez que le conteneur de destination est passé en tant que premier paramètre et que son contenu précédent est écrasé après l’appel de fonction.

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;

L’appel boost::split dans l’extrait de code précédent stocke des chaînes vides lorsque deux ou plusieurs délimiteurs sont côte à côte. Cependant, nous pouvons spécifier le quatrième paramètre facultatif - boost::token_compress_on et les délimiteurs adjacents seront fusionnés comme indiqué dans l’exemple suivant. N’oubliez pas que les bibliothèques Boost doivent être installées sur le système si vous souhaitez exécuter ces deux extraits de code avec succès.

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace, boost::token_compress_on);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

Lorem; ipsum; dolor; sit; amet,; consectetur; adipiscing; elit.;

Utilisez stringstream avec la fonction getline pour diviser la chaîne avec des délimiteurs

Alternativement, on peut utiliser la classe stringstream et la fonction getline pour diviser le texte avec le délimiteur de caractères donné. Dans ce cas, nous n’utilisons que des outils STL et il n’est pas nécessaire d’inclure des en-têtes Boost. Notez que cette version de code est plus volumineuse et nécessite des étapes supplémentaires pour fusionner les caractères délimiteurs adjacents.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  char space_char = ' ';
  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    words.push_back(word);
  }

  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Boost