La función boost::split en C++

Jinku Hu 12 octubre 2023
  1. Utilice la función boost::split para tokenizar la cadena dada
  2. Utilice la función stringstream con getline para dividir la cadena con delimitadores
La función boost::split en C++

Este artículo demostrará cómo utilizar la función boost::split en C++.

Utilice la función boost::split para tokenizar la cadena dada

Boost proporciona herramientas poderosas para ampliar la biblioteca estándar de C++ con bibliotecas maduras y bien probadas. Este artículo explora la función boost::split, que es parte de la biblioteca de algoritmos de cadenas de Boost. Este último incluye varios algoritmos de manipulación de cadenas como recortar, reemplazar, etc.

La función boost::split divide la secuencia de cadenas dada en tokens separados por el delimitador. El usuario debe proporcionar una función de predicado que identifique el delimitador como tercer parámetro. La función proporcionada debe devolver true si el elemento dado es un delimitador.

En el siguiente ejemplo, especificamos un objeto de función isspace para identificar espacios en el texto dado y dividirlos en tokens. boost::split también necesita un contenedor de secuencia de destino para almacenar subcadenas tokenizadas. Tenga en cuenta que el contenedor de destino se pasa como primer parámetro y su contenido anterior se sobrescribe después de la llamada a la función.

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

Producción :

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

La llamada boost::split en el fragmento de código anterior almacena cadenas vacías cuando dos o más delimitadores están uno al lado del otro. Aunque, podemos especificar el cuarto parámetro opcional - boost::token_compress_on y los delimitadores adyacentes se fusionarán como se muestra en el siguiente ejemplo. Tenga en cuenta que las bibliotecas de Boost deben estar instaladas en el sistema si desea ejecutar estos dos fragmentos de código correctamente.

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

Producción :

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

Utilice la función stringstream con getline para dividir la cadena con delimitadores

Alternativamente, se puede emplear la clase stringstream y la función getline para dividir el texto con el delimitador de caracteres dado. En este caso, solo utilizamos herramientas STL y no es necesario incluir encabezados de Boost. Tenga en cuenta que esta versión de código es más voluminosa y necesita pasos adicionales para fusionar los caracteres delimitadores adyacentes.

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

Producción :

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
Autor: 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

Artículo relacionado - C++ Boost