2011-04-18 15 views
7

Deseo dividir una cadena en un solo carácter o una cadena. Me gustaría utilizar boost::split ya que la cadena boost es nuestro estándar para el manejo básico de cadenas (no deseo mezclar varias técnicas).impulso dividido con un solo carácter o solo una cadena

En el caso de un solo carácter podría hacer split(vec,str,is_any_of(':')), pero me gustaría saber si hay una manera de especificar un solo carácter. Puede mejorar el rendimiento, pero lo más importante es que creo que el código sería más claro con un solo carácter, ya que is_any_of transmite un significado diferente al que yo quiero.

Para hacer coincidir contra una cadena, no sé qué sintaxis usar. No deseo construir una expresión regular; alguna sintaxis simple como split(vec,str,match_str("::") sería buena.

Respuesta

3

En el siguiente código, permítanme suponer using namespace boost para abreviar.
En cuanto a la división en un personaje, aunque sólo sea algorithm/string está permitido, is_from_range podría servir al propósito:

split(vec,str, is_from_range(':',':')); 

Alternativamente, si lambda está permitido:

split(vec,str, lambda::_1 == ':'); 

o si la preparación de un predicado dedicado es permitido:

struct match_char { 
    char c; 
    match_char(char c) : c(c) {} 
    bool operator()(char x) const { return x == c; } 
}; 

split(vec,str, match_char(':')); 

En concordancia con el partido ing contra una cadena, como David Rodri'guez mencionado, parece que no hay camino con split. Si se permite iter_split, probablemente el siguiente código se reunirá con el propósito:

iter_split(vec,str, first_finder("::")); 
+0

Todos son buenos. Gracias. –

+0

Me alegra que haya ayudado :-) –

+1

C++ 11 respuesta: '[] (char c) {return c == ':'}' es decir, lambda nativo. – MSalters

1

En el token simple, simplemente dejaría is_any_of, ya que es bastante fácil de entender lo que significa is_any_of(single_option). Si realmente desea cambiarlo, el tercer elemento es un funtor, por lo que puede pasar un funcionador equals a la función split.

Ese enfoque no funcionará realmente con varios tokens, ya que la iteración debe ser de carácter por carácter. No conozco la biblioteca lo suficiente como para ofrecer alternativas precompiladas, pero puede implementar la funcionalidad en la parte superior de

10

que estaba buscando la misma respuesta, pero no pude encontrar uno. Finalmente logré producir uno solo.

Puede usar std::equal_to para formar el predicado que necesita. Aquí hay un ejemplo:

boost::split(container, str, std::bind1st(std::equal_to<char>(), ',')); 

Así lo hago exactamente cuando necesito dividir una cadena con un solo carácter.

Cuestiones relacionadas