2011-02-25 13 views
22

No estoy seguro de cómo usar boost::is_any_of para dividir una cadena usando un conjunto de caracteres, cualquiera de los cuales debe dividir la cadena.Tokens divididos múltiples usando boost :: is_any_of

Quería hacer algo como esto ya que entendí que la función is_any_of toma un parámetro 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)); 

Sin embargo, esto produce una lista de errores de impulso/STD. ¿Debo persistir con is_any_of o hay una mejor manera de hacerlo, por ej. usando una división de expresiones regulares?

+0

Es una pena que 'is_any_of' no tome un rango de iterador. – Inverse

Respuesta

27

Usted deberá probar esto:

boost::split(line_parts, s_line, boost::is_any_of("\t,|")); 
9

Su primera línea no es válida sintaxis de C++ sin una variable pre-existente denominado line y boost::is_any_of hace falta ser un std::set como un parámetro de constructor.

#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/` 
} 
1

El problema que muchos boost::is_any_of toma un std::string o una char* como parámetro. No es un std::set<std::string>.

Debe definir delims como std::string delims = "\t,|" y luego funcionará.

Cuestiones relacionadas