Vectores c++

Iniciado por Stakewinner00, 11 Julio 2012, 20:15 PM

0 Miembros y 1 Visitante están viendo este tema.

Stakewinner00

Estoy comenzando ocn esto de los vectores y me gustaria saber 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.

0xDani

Puedes usar dos bucles for anidados:
Código (cpp) [Seleccionar]

for(int i=0;i<tamanovector;i++){
for(int j=0; j<tamanovector-1; j++){
  if vector[i]==vector[j]{
   printf("Se repiten");
   break;
}
  else continue;
}

}


Creo que funcionaria, pero lo he improvisado.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Stakewinner00

Muchas gracias

Gracais X2 por la velocidad jaja

Ahora lo voi a provar

Stakewinner00

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.


Foxy Rider

#4
@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 (cpp) [Seleccionar]
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std; // no abusar de esto !

int main(int argc, char** argv)
{
   //1 2 3 4 5 6 7 8 2 9
   vector<int> numVector;
       numVector.push_back(1);
       numVector.push_back(2);
       numVector.push_back(3);
       numVector.push_back(4);
       numVector.push_back(5);
       numVector.push_back(6);
       numVector.push_back(7);
       numVector.push_back(8);
       numVector.push_back(2);
       numVector.push_back(9);
       
  sort(numVector.begin(),numVector.end()); // Ordenamos
   vector<int>::iterator Iterator = adjacent_find(numVector.begin(),numVector.end(), equal_to<int>());  // Usamos busqueda de adyacente, usando equal_to para comparar
   
 if (*Iterator) cout << "Numero repetido : " << *Iterator << endl;
     
   return 0;
}



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 (cpp) [Seleccionar]
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std; // no abusar de esto !

int main(int argc, char** argv)
{
   map<int,int> mapNumbers;
   vector<int> vecNumbers;
       vecNumbers.push_back(1);
       vecNumbers.push_back(2);
       vecNumbers.push_back(2);
       vecNumbers.push_back(3);
       vecNumbers.push_back(4);
       vecNumbers.push_back(5);
       vecNumbers.push_back(6);
       vecNumbers.push_back(7);
       vecNumbers.push_back(8);
       vecNumbers.push_back(8);
       vecNumbers.push_back(2);
       vecNumbers.push_back(9);
           
  for(int Number: vecNumbers)
  {
      int numberCount = count(vecNumbers.begin(),vecNumbers.end(),Number);
      if ( numberCount > 1) mapNumbers[Number] = numberCount;
  }
 
  for(auto valuePair:mapNumbers)
      cout << "The number " << valuePair.first << " repeated " << valuePair.second << " times" << endl;      
     
   return 0;
}



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.

Stakewinner00

Gracias lo voi a probar.

DickGumshoe

Citarsi 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!

Foxy Rider

#7
Cita de: DickGumshoe en 14 Julio 2012, 19:29 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.

DickGumshoe

Ah, muchas gracias por la respuesta!