# Como eliminar elementos de un vector en C



## Unikfriend (Sep 13, 2012)

Hola...
Alguien sabe porque no puedo eliminar un elemento de un vector en "C" 
cuando este declarado como variable global?

es codigo lo baje de internet y funciona bien cuando "myvector"
esta declarado dentro del main. Pero si lo intento declarar como variable
global marca error:




```
#include <iostream.h>
#include <vector.h>
using namespace std;
vector<unsigned int> myvector;    //global
 
int main ()
{
unsigned int i;
//vector<unsigned int> myvector;   //local
 
for (i=1; i<=10; i++) myvector.push_back(i);
myvector.erase(myvector.begin() + 6);
myvector.erase(myvector.begin() + 2);
cout << "myvector contains:";
for (i=0; i<myvector.size(); i++)
cout << " " << myvector[i];
cout << endl;
return 0;
}
```
 
Si alguien tiene una idea de que me esta faltando
le agradeceria mucho me lo hagan saber.
de antemano muchas gracias. 
Slds


----------



## cosmefulanito04 (Sep 14, 2012)

Eso tiene toda la pinta de C++ (nunca programé en ese lenguaje, pero se parece a Java).

En "C" para trabajar con vectores dinámicos lo mejor es usar punteros y las funciones malloc/calloc seguido de un free c/vez que dejas de usar el recurso. Este tipo de elementos no existen en C++/Java o todos los lenguajes orientados a objetos.


----------



## Unikfriend (Sep 14, 2012)

Hi Cosme,

Si he utilizado el malloc/calloc pero queria utilizar un vector dinamico en ciertos casos.
hasta ahorita no encontrado algo que me explique si hay restriciones en cuanto a su uso.
Slds.


----------



## cosmefulanito04 (Sep 14, 2012)

Bien, pero vos publicaste un código en C++, por eso la duda, ¿qué usas, C o C++?


----------



## Unikfriend (Sep 14, 2012)

Yo principalmente utilizo c++;
Este ejemplo tal cual lo baje de la pagina cplusplus.com.

Slds.[/size][/SIZE][/SIZE][/SIZE]


----------



## cosmefulanito04 (Sep 14, 2012)

Bue como te dije yo nunca usé C++, por lo tanto no puedo ser de mucha utilidad. Pero si te sirve puedo tirarte una solución en C:


```
....
char *puntero; //Creo un puntero 
.....
vector=(char *)malloc(4);      // Reservo 4 bytes para el vector
*vector=1;  //Inicializo el vector con 1,2,3,4
*(vector+1)=2;
*(vector+2)=3;
*(vector+3)=4;
....
vector=eliminar_elemento(vector,2,4); //llamo a una función que elimine el 3er elemento del vector
...
free(vector); //libero la memoria usada por vector
```


```
char * eliminar_elemento(char *vector,int indice,int tamanio_vector)
{
    int cont;
    char *auxiliar=NULL;

    if(tamanio_vector>1)
        auxiliar=(char *)malloc(tamanio_vector-1);
    else
        return vector;
    
    if(auxiliar==NULL)
       return vector;  // Significa que no hay más memoria disponible en el sistema

    for(cont=0;cont<tamanio_vector-1;cont++)
        {
            if(cont<indice)
                *(auxiliar+cont)=*(vector+cont);
            else
                *(auxiliar+cont)=*(vector+cont+1);
        }

    free(vector);
    return auxiliar;
}
```

Con esa función, liberás la memoria original del vector (osea los 4 bytes que pediste) y el vector pasa hacer el auxiliar con un elemento menos del vector original (osea solo 3 bytes), en este caso quedaría quedaría así:

vector original --> 1,2,3,4
vector final --> 1,2,4


----------



## MVB (Sep 14, 2012)

Primero que todo, el ejemplo como ya lo mencionaron es c++, el tipo vector es exclusivo de c++.
Ahora, he probado el ejemplo, haciendo un par de pequeñas modificaciones y funciona perfectamente, no creo que exista ninguna limitación particular cuando esas variables son globales.

El ejemplo lo he compilado en linux usando g++, espero que te sirva y nos brindes mas información, por ejemplo que compilador estas usando.

```
#include <vector>
#include <iostream>
using namespace std;
vector<unsigned int> myvector;    //global
 
int main ()
{
    unsigned int i;
    //vector<unsigned int> myvector;   //local
     
    for (i=1; i<=10; i++) myvector.push_back(i);
    myvector.erase(myvector.begin() + 6);
    myvector.erase(myvector.begin() + 2);
    cout << "myvector contains:";
    for (i=0; i<myvector.size(); i++)
        cout << " " << myvector[i];
    cout << endl;
    return 0;
}
```


----------



## Unikfriend (Sep 17, 2012)

Hi MVB,

Estoy utilizando Visual C++ 2010 Express. pero nomas no funciona.
Creo que tendre que utilizar algo como lo que sugiere Cosme.
Slds.

​


----------



## cosmefulanito04 (Sep 17, 2012)

Hace una cosa, probá con esto que es java y que se asemeja mucho a C++:

- Creas una clase llamada "eliminar_elemento_vector" (me mate con el nombre) y definís esta función:


```
public class eliminar_elemento_vector {
    
    public int[] eliminar_elemento(int [] vector_original,int indice_a_eliminar)
    {
        int[] vector_aux=new int[vector_original.length-1];
               
        for(int cont=0;cont<vector_original.length-1;cont++)
        {
            if(cont<indice_a_eliminar)
                vector_aux[cont]=vector_original[cont];
            else
                vector_aux[cont]=vector_original[cont+1];
        }
                
        return vector_aux;
    }
    
}
```

Ahora desde donde estés, simplemente creas el objeto de esa clase y llamás a la función para que reemplace el vector, ejemplo:


```
public class Eliminar_elemento {

    /**
     * @param args the command line arguments
     */
    
    
    public static void main(String[] args) {
        int[] vector={1,2,3,4};  //Creo el vector original
        
        eliminar_elemento_vector eliminar=new eliminar_elemento_vector(); //Creo el objeto de la clase que mencione arriba
        
        System.out.println("Tamaño vector original :"+String.valueOf(vector.length)+" Vector[2]= "+String.valueOf(vector[2])+"\n");  //Imprimo en consola el tamaño original del vector y el valor del elemento 3
        
        vector=eliminar.eliminar_elemento(vector,2); //Llamo a la función eliminar_elemento de la clase antes mencionada y reemplazo el vector original por uno que tiene un elemento menos {1,2,4}
        
        System.out.println("Tamaño vector final :"+String.valueOf(vector.length)+" Vector[2]= "+String.valueOf(vector[2])+"\n"); //Imprimo en consola el tamaño final del vector y el nuevo valor del elemento 3 (osea 4)
    }
}
```


----------

