[C con Clase] [c con clase] eliminar elemento Vector

Steven Richard Davidson stevenrichard.davidson en gmail.com
Mar Ago 28 19:19:43 CEST 2007


Hola Roberto,

On 8/26/07, Roberto Vivancos Galiano <info en esferanegra.com> wrote:
> Hola
>
> estoy tratando de hacer un ejercicio que pida por pantalla un numero que
> pueda estar o no incluido en un vector, que guarda los primeros diez
> numeros pares:
>

Programante ya te ha respondido, pero quiero agregar a lo dicho.

> este es la funcion eliminar... pero no borra nada...
>
> bool eliminar (vector<int> &v, int x){
>     vector<int>::iterator it;
>     for (it =v.begin();it=v.end(); it++){

Esto es un error. En la expresión condicional, estás (re)asignando el
iterador 'it', en lugar de comprobar su valor. Debería ser:

for( it = v.begin(); it != v.end(); it++ )

>         if(*it == x){
>
>
>                 v.erase(it);
>             cout << "borrando" << endl;
>             return true;
>         }else {
>
>             cout << "no borrado" << endl;
>             return false;

Como bien dijo Programante, no sería correcto terminar nuestra
búsqueda nada más empezar.

>             }
>
>     }
> }
>

Por otra parte, no es recomendable mostrar mensajes dentro de un
algoritmo el cual no requiere tal impresión por pantalla. Sospecho que
tienes las sentencias 'cout' para ayudar en la programación.

>
> otra forma que tampoco calandra:
>
>
> bool eliminar (vector<int> &v, int x){
>     vector<int>::iterator it;
>     for (int i=0;i<v.size(); i++){

Aconsejo guardar el valor retorando por 'v.size()' previamente. De lo
contrario, estás invocando varias veces la misma función la cual no
cambiará, antes de la eliminación de tal elemento.

>         if(v.at(i) == x){

Como has usado 'v.size()', sabemos que no nos pasaremos del tamaño del
objeto 'vector<int>'. Por esta razón, podríamos usar el operador
sobrecargado []. Esto es,

if( v[i] == x )

>
>
>                 v.erase(i);

Esto no es correcto. La función miembro 'erase()' sólo acepta
iteradores. Tendrás que conseguir el iterador a partir de la
referencia 'v[i]'. Esto es algo más complicado de lo que debería ser y
por tanto sugiero usar tu algoritmo anterior que ya usa iteradores.

>             cout << "borrando" << endl;
>             return true;
>         }else {
>
>             cout << "no borrado" << endl;
>             return false;

Nuevamente, saca la sentencia 'return false' fuera del bucle.

>             }
>
>     }
> }
>

Espero haber aclarado las dudas.

Steven




Más información sobre la lista de distribución Cconclase