elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  devolver vector único
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: devolver vector único  (Leído 2,863 veces)
indict

Desconectado Desconectado

Mensajes: 78


Ver Perfil
devolver vector único
« en: 30 Junio 2013, 17:06 pm »

Hola de nuevo,

querría hacer una función que devolviera un vector con solo únicos elementos, es decir sin elementos repetidos. Para ello he creído ordenar primeramente el vector ya que así se puede trabajar de forma mas sencilla.  El programa me devuelve correctamente el vector con elementos no repetidos, lo único que al final del vector aparece una combinación de números que sobra, debida por algún error.

Si pudieras decirme si sería posible rectificar ese error. Gracias :).

Código
  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. void ordena_seleccion(vector<int>& v) {
  6.    for (int i = 0; i < v.size(); i++) {
  7.        int min = i;
  8.        for (int c = i + 1; c < v.size(); c++) {
  9.            if (v[min] > v[c]) min = c;
  10.        }
  11.        int aux = v[i];
  12.        v[i] = v[min];
  13.        v[min] = aux;
  14.    }
  15. }
  16.  
  17.  
  18. vector<int>unico(vector<int>&v){
  19. ordena_seleccion(v);
  20. int i=0;
  21. vector<int>p;
  22.  
  23. while(i<v.size()){
  24.        if(v[i]!=v[i+1]){
  25.        p.push_back(v[i]);
  26.        p.push_back(v[i+1]);
  27.        i=i+2;}
  28.        i++; }
  29.        return p;      }
  30.  
  31. int main(){
  32.      int n,e;
  33.    cout<<"introduzca el tamaño del vector "<<endl;
  34.    cin>>n;
  35.  
  36.    vector<int>v(n);
  37.    for(int i=0;i<n;i++){
  38.            cout<<"elemento"<<endl;
  39.            cin>>e;
  40.            v[i]=e;
  41.            }
  42.  
  43.    vector<int>p=unico(v);
  44.    cout<<endl;
  45.    cout<<"[";
  46.    for(int i=0;i<v.size();i++){
  47.            cout<<p[i]<<"  ";
  48.            }
  49.    cout<<"]"<<endl;
  50.    system("pause");
  51.    return 0;}
  52.  


En línea

satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: devolver vector único
« Respuesta #1 en: 30 Junio 2013, 21:30 pm »

Buenas!!

He mirado el código por encima y no lo puedo probar pero creo que el fallo está en:
Código
  1. for(int i=0;i<v.size();i++){
  2.           cout<<p[i]<<"  ";
  3.           }

Debes cambiar v.size() por p.size() en el for

Prueba a ver si es eso y dinos qué tal

Saludos!!


En línea

Breakbeat como forma de vida
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: devolver vector único
« Respuesta #2 en: 1 Julio 2013, 01:47 am »

El problema se debe a la función donde obtienes los elementos sin repeticiones:
Código
  1. vector<int> unico(vector<int>&v)
  2. {
  3.   ordena_seleccion(v);
  4.   unsigned i=0;
  5.   vector<int>p;
  6.  
  7.   while (i < v.size()){
  8.      if (v[i] != v[i+1]){
  9.         p.push_back(v[i]);
  10.         p.push_back(v[i+1]);
  11.         i = i + 2;
  12.      }
  13.  
  14.      i++;
  15.   }
  16.  
  17.   return p;
  18. }
Supongamos que el vector pasado como argumento contiene los valores 0, 1 y 2, entonces:

1) La variable "i" toma el valor 0.
2) Se entra al bucle ya que 0 es menor que 3.
3) Ya que el elemento v[0] es diferente de v[1] agregas ambos.

Aquí el error:

4) Se incrementa "i" en dos unidades, "i" es igual a 2.
5) Se incrementa "i" en una unidad, "i" es igual a 3.
6) Termina el bucle ya que el valor de i no es menor que el numero de elementos en el vector.

La corrección es simple, agregas el primer valor de forma manual y los restantes siempre y cuando el valor procesado sea distinto del anterior:
Código
  1. vector<int> unico(vector<int>& v)
  2. {
  3.   ordena_seleccion(v);
  4.   vector<int> p;
  5.   p.push_back(v[0]);
  6.  
  7.   for (unsigned i = 1; i < v.size(); i++)
  8.      if (v[i] != v[i - 1])
  9.         p.push_back(v[i]);
  10.  
  11.   return p;
  12. }

También debes modificar la parte donde se imprime el vector sin duplicados, solo debes seguir la indicación de satu, la condición en el bucle:
Código
  1. for (unsigned i = 0; i < v.size(); i++){
  2.   cout << p[i] << "  ";
  3. }
Debe ser "i < p.size()".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: devolver vector único
« Respuesta #3 en: 1 Julio 2013, 18:14 pm »

Buenas!!

Propongo otra forma: utilizar el contenedor set como forma de eliminar repetidos y ordenamiento:

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. void unico(vector<int> &v){
  8.    set<int> aux;
  9.    set<int>::const_iterator it;
  10.  
  11.    aux.insert(v.begin(), v.end());
  12.  
  13.    v.clear();
  14.  
  15.    for(it = aux.begin(); it != aux.end(); it++) {
  16.        v.push_back(*it);
  17.    }
  18. }
  19.  
  20. int main(){
  21.    int n, e;
  22.    cout << "Introduzca el tamaño del vector " << endl;
  23.    cin >> n;
  24.  
  25.    vector<int> v;
  26.    for(int i = 0; i < n; i++) {
  27.        cout << "elemento" << endl;
  28.        cin >> e;
  29.        v.push_back(e);
  30.    }
  31.  
  32.    unico(v);
  33.    cout << endl;
  34.    cout << "[";
  35.    for(unsigned i = 0; i < v.size(); i++) {
  36.        cout << v[i] << "  ";
  37.    }
  38.    cout << "]" << endl << endl << "Pulsa Enter para salir..." << endl << endl;
  39.    cin.sync();
  40.    cin.get();
  41.    return 0;
  42. }

Saludetes
En línea

Breakbeat como forma de vida
indict

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Re: devolver vector único
« Respuesta #4 en: 2 Julio 2013, 01:45 am »

Gracias rir3760 y satu por todas vuestras aportaciones y ayudas ¡sois increibles! :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
devolver valor de uan funcion
Programación C/C++
mapers 1 2,772 Último mensaje 15 Noviembre 2010, 05:14 am
por Mr.Blue
Devolver un vector en una funcion
Programación C/C++
d00ze13 5 25,223 Último mensaje 12 Enero 2011, 09:41 am
por leogtz
Devolver vector en Java
Java
Seruk 6 25,125 Último mensaje 19 Octubre 2012, 18:11 pm
por Seruk
Ayuda devolver un vector de una funcion
Programación C/C++
kur79 1 2,106 Último mensaje 28 Octubre 2014, 19:07 pm
por avesudra
Devolver un arreglo o vector desde una funcion.
Programación C/C++
MartNahuel95 2 4,145 Último mensaje 10 Junio 2016, 04:09 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines