2011-03-24 20 views
8

que estoy tratando de hacer una sentencia if dentro de un bucle con un iterador sobre una cadena, pero no puedo encontrar la manera de obtener el carácter actual de la sentencia if:C++ iterador cadena

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) { 
    if (!isalpha(*i) && !isdigit(*i)) { 
     if(i != "-") { // obviously this is wrong 
      buffer.erase(i); 
     } 
    } 
} 

Puede Alguien me ayuda a obtener el personaje actual para que pueda hacer algunas declaraciones adicionales si?

+0

¿Por qué Marcar este C? – GManNickG

+0

realmente no necesita el isalpha y isdigit compruebe si va a verificar para un personaje específico inmediatamente después – AJG85

Respuesta

19

no puedo encontrar la manera de obtener el carácter actual

Usted lo hace dos veces aquí:

if (!isalpha(*i) && !isdigit(*i)) 

que desreferenciar Cuando un iterador (*i), se obtiene el elemento a lo que apunta.

"-" 

Esto es una cadena literal, no un personaje. Las constantes de caracteres utilizan comillas simples, por ejemplo, '-'.

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) 

esto sería mucho más simple con iteradores inversa:

for (std::string::reverse_iterator i = buffer.rbegin(); i != buffer.rend(); ++i) 
+1

if ((* i)!= '-')) en caso de que necesite más aclaraciones – Pepe

+0

@ P.R .: Buena captura en el '" - "'. –

+0

que funcionó, ¡gracias! – Joe

2

para obtener el carácter acaba de decir *i, pero esto no es suficiente. Su ciclo no es legal porque no está permitido decrementar antes del begin. Debería usar iteradores inversos o el algoritmo remove_if.

1

Lo tienes arriba en la declaración anterior if: i es un iterador, por lo que *i da el carácter al que hace referencia el iterador.

Tenga en cuenta que si va a repetir una colección al revés, generalmente es más fácil usar un reverse_iterator con rbegin y rend. Sin embargo, probablemente usaría un algoritmo preempaquetado.

3
if(i != "-") 

debe ser

if(*i != '-') 
2

Otras respuestas han resuelto el problema particular que usted tiene, pero debe tener en cuenta que existen diferentes enfoques para resolver su problema real: Elementos de borrado que la tarea de rellenar una condición. Que se puede resolver fácilmente con la quitar/borrar idioma:

// C++0x enabled compiler 
str.erase( 
    std::remove_if(str.begin(), str.end(), 
        [](char ch) { return !isalpha(ch) && !isdigit(ch) && ch != '-' }), 
    str.end()); 

Si bien esto puede parecer engorroso al principio, una vez que haya visto un par de veces ya no será sorprendente, y es un eficaz forma de eliminar elementos de un vector o cadena.

Si el compilador no tiene soporte lambda, entonces usted puede crear un funtor y pasarlo como el tercer argumento a remove_if:

// at namespace level, sadly c++03 does not allow you to use local classes in templates 
struct mycondition { 
    bool operator()(char ch) const { 
     return !isalpha(ch) && !isdigit(ch) && ch != '-'; 
    } 
}; 
// call: 
str.erase( 
    std::remove_if(str.begin(), str.end(), mycondition()), 
    str.end()); 
+0

¡No puedo creer que sea el primero en votar esto! :-) –