La función boost::split en C++
-
Utilice la función
boost::split
para tokenizar la cadena dada -
Utilice la función
stringstream
congetline
para dividir la cadena con delimitadores
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.;
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