Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Stakewinner00 en 11 Julio 2012, 20:15 pm



Título: Vectores c++
Publicado por: Stakewinner00 en 11 Julio 2012, 20:15 pm
Estoy comenzando ocn esto de los vectores y me gustaria saver como puedo crear un vector que de una sequencia de numeros encuentre 2 numeros que sean iguales.

Ejemplo:

Primero le dices la cantidad de numeros que hay en esa sequencia por ejemplo 9

y despues pones alguna sequencia cualquiera como

1 2 3 4 5 6 7 8 2 9

y en este caso el vector tendria que indicar que hay 2 numeros iguales .

Espeor k me puedan ayudar lo antes posible

Muchas gracias.


Título: Re: Vectores c++
Publicado por: 0xDani en 11 Julio 2012, 20:23 pm
Puedes usar dos bucles for anidados:
Código
  1. for(int i=0;i<tamanovector;i++){
  2. for(int j=0; j<tamanovector-1; j++){
  3.  if vector[i]==vector[j]{
  4.   printf("Se repiten");
  5.   break;
  6. }
  7.  else continue;
  8. }
  9.  
  10. }
  11.  

Creo que funcionaria, pero lo he improvisado.

Saludos.


Título: Re: Vectores c++
Publicado por: Stakewinner00 en 11 Julio 2012, 20:25 pm
Muchas gracias

Gracais X2 por la velocidad jaja

Ahora lo voi a provar


Título: Re: Vectores c++
Publicado por: Stakewinner00 en 11 Julio 2012, 21:49 pm
Bueno lo prove y va a medias lo pase a c++ por k me daba errores y ahora aver si puedo decir cuantas veces se repitio ese numero.



Título: Re: Vectores c++
Publicado por: Foxy Rider en 14 Julio 2012, 18:51 pm
@daniyo → En general, así no se usan los vectores en C++, eso luce mucho a simple código C ...  si bien es legal, en general se usa la librería estándar de C++

Tenes varias formas de hacerlo, las que me llegan a la cabeza:
 
* Usando los operadores size,at (o el operador [] que esta sobrecargado)  de std::vector
* Recorrer el vector como un container usando iteradores (begin y end) con fors anidados
* Usando std::sort y std::adjacent_find
* Usando std::count
* std::map ?

Yo voy a poner la tercera (que no es la mas facil, pero tampoco la mas compleja) ... pero te diría que experimentes con las otras :D

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std; // no abusar de esto !
  6.  
  7. int main(int argc, char** argv)
  8. {
  9.    //1 2 3 4 5 6 7 8 2 9
  10.    vector<int> numVector;
  11.        numVector.push_back(1);
  12.        numVector.push_back(2);
  13.        numVector.push_back(3);
  14.        numVector.push_back(4);
  15.        numVector.push_back(5);
  16.        numVector.push_back(6);
  17.        numVector.push_back(7);
  18.        numVector.push_back(8);
  19.        numVector.push_back(2);
  20.        numVector.push_back(9);
  21.  
  22.   sort(numVector.begin(),numVector.end()); // Ordenamos
  23.    vector<int>::iterator Iterator = adjacent_find(numVector.begin(),numVector.end(), equal_to<int>());  // Usamos busqueda de adyacente, usando equal_to para comparar
  24.  
  25.  if (*Iterator) cout << "Numero repetido : " << *Iterator << endl;
  26.  
  27.    return 0;
  28. }
  29.  
  30.  

En el nuevo estandar C++ aprobado (C++11), esto se puede hacer facilmente con for de rango (cuando veas lo simplificados que estan los fors, no vas a querer ver los viejos fors, nunca, pero nunca mas), for_each (usando lambdas), eeeeeeeeeetc ... la creatividad no tiene limites (y menos con C++11 =D ).

Un ejemplo con un minimo toque de C++11 (solo ranged fors) ... que es bastante ineficiente (se re-recorre asquerosamente el vector de manera innecesaria),  pero sacrificamos esa eficiencia para tener algo mas potable a los ojos:

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <algorithm>
  5.  
  6. using namespace std; // no abusar de esto !
  7.  
  8. int main(int argc, char** argv)
  9. {
  10.    map<int,int> mapNumbers;
  11.    vector<int> vecNumbers;
  12.        vecNumbers.push_back(1);
  13.        vecNumbers.push_back(2);
  14.        vecNumbers.push_back(2);
  15.        vecNumbers.push_back(3);
  16.        vecNumbers.push_back(4);
  17.        vecNumbers.push_back(5);
  18.        vecNumbers.push_back(6);
  19.        vecNumbers.push_back(7);
  20.        vecNumbers.push_back(8);
  21.        vecNumbers.push_back(8);
  22.        vecNumbers.push_back(2);
  23.        vecNumbers.push_back(9);
  24.  
  25.   for(int Number: vecNumbers)
  26.   {
  27.       int numberCount = count(vecNumbers.begin(),vecNumbers.end(),Number);
  28.       if ( numberCount > 1) mapNumbers[Number] = numberCount;
  29.   }
  30.  
  31.   for(auto valuePair:mapNumbers)
  32.       cout << "The number " << valuePair.first << " repeated " << valuePair.second << " times" << endl;      
  33.  
  34.    return 0;
  35. }
  36.  
  37.  

Simple, sin lambdas, ni hash, ni nada de esa indole por que son features que queman mucho la legibilidad del codigo para alguien que maneja C++03 y ahi nomas ... si alguien quiere un ejemplo mas eficiente y que toque mas cosas de C++11 para ver como es, pida nomas :D

Saludos.


Título: Re: Vectores c++
Publicado por: Stakewinner00 en 14 Julio 2012, 19:12 pm
Gracias lo voi a probar.


Título: Re: Vectores c++
Publicado por: DickGumshoe en 14 Julio 2012, 19:29 pm
Citar
si alguien quiere un ejemplo mas eficiente y que toque mas cosas de C++11 para ver como es, pida nomas

¿Se sabe cuándo estará disponible C++ 11 de forma gratuita? Según Wikipedia está sujeta a pago todavía...

Saludos y gracias!


Título: Re: Vectores c++
Publicado por: Foxy Rider en 14 Julio 2012, 19:51 pm
¿Se sabe cuándo estará disponible C++ 11 de forma gratuita? Según Wikipedia está sujeta a pago todavía...

Saludos y gracias!

C++11 YA es un estándar ISO (se aprobó hace algunos meses, si no es que un año) que define al C++ actual... en ningún momento fue pago, lo que se pagaba era el acceso al borrador con las 1300 hojas que describen al estándar (y supongo que las ~1300 del estándar final también, obvio), que es lo que usan los que hacen compiladores.
Ya se anda implementando en compiladores libres como GCC y Clang .... la gente del Visual Studio si mal no recuerdo está algo atrás.

Hace no mucho lo mejor para probar C++11 era Clang, pero GCC está apostando fuerte a este estándar, y está bastante peleado ... e incluso me pasa de que en Clang me faltan algunas cosas que en GCC están (bueno, por lo menos en debian, que para que todo compile  bien, LLVM es más vieja), me pasó con los inicializadores (por ejemplo, iniciar un std::vector constante en namespace global con una lista de valores) y expresiones lambda (junto con todo lo relacionado, como std::function)

Saludos.


Título: Re: Vectores c++
Publicado por: DickGumshoe en 14 Julio 2012, 20:55 pm
Ah, muchas gracias por la respuesta!