[C++] Ayuda con loops y vectores

Alberteban

Buenas, perdonad por el título genérico pero no tenía otra forma de explicarlo. Básicamente quiero llenar un vector de strings (he pensado hacerlo con un for), el vector recibirá los datos a través del teclado (con cin). Hasta aquí bien pero no tengo ni idea de cómo hacer para poder parar el ciclo y dejar de rellenar el vector en el momento que yo quiera. Es decir, podría hacer un tamaño máximo no muy amplio y al llegar ahí se acabaría. Pero quiero que sea variable. Había pensado entonces en condicionar el ciclo con un while pero no tengo ni idea de qué es lo que tiene que haber en el while para que funcione. Tengo hecho esto:

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    int tam = 1000;
    string collar[tam];
    cout << "Introduce el nombre de una mazmorra: " ;
    cout << "Cuando termines de introducir datos pulsa 0";
    
do{ for (int i = 0; i < tam; i++) cin >> collar[i]; }while (); return 0; }

Pensé en condicionar con el 0, pero me sirve cualquier cosa. Además si alguien cree que todo esto se puede hacer de otra forma mas simple o lo que sea también me gustaría saberlo :).

B

Te sirve algo así?

const int max_collar_size = 1000;

std::vector< string > collar;
std::string current;
while(collar.size() < max_collar_size && std::cin >> current && current != "0") {
  collar.push_back(current);
}

Básicamente, dejaremos de meter cosas en "collar" cuando una de las tres se cumpla:

1) Hay max_collar_size elementos en collar ya metidos
2) La entrada ha terminado (si metes datos con teclado, pulsa Ctrl+D)
3) La entrada es 0

Es lo que querías?

1 respuesta
Alberteban

#2 Eso es lo que quiero, si, pero el while no me compila XD

simplemente he copiado y he cambiado el max_collar_sized por el tam de mi programa original:

const int tam = 1000;
    vector <string> collar;
    string current;
    cout << "Introduce el nombre de una mazmorra: " ;
    cout << "Cuando termines de introducir datos pulsa 0";
    
do{ for (int i = 0; i < tam; i++) cin >> collar[i]; }while (collar.size < tam && cin >> current && current != "0"){ collar.push_back(current); } return 0; }

Me saltan varios errores en el while:

  • unexpected token: {
  • unable to resolve identifier size
  • main.cpp:34:20: error: invalid use of member 'std::vector<_Tp, Alloc>::size_type std::vector<Tp, _Alloc>::size() const [with _Tp = std::basic_string<char>; Alloc = std::allocator<std::basic_string<char> >; std::vector<Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '&' ?)
  • error: expected ';' before '{' token

he probado a añadir #include <vector> pero sigue sin tirar

1 respuesta
B

#3 Has de borrar tu do while, y dejar solamente el while

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int tam = 1000;

int main() {
  vector <string> collar;
  string current;
  cout << "Introduce el nombre de una mazmorra: " ;
  cout << "Cuando termines de introducir datos pulsa 0";
  while (collar.size() < tam && cin >> current && current != "0"){
    collar.push_back(current);
  }
  return 0;
}
1 respuesta
Alberteban

#4 y sin el ciclo for y su cin como puedo introducir los datos al ejecutar el programa? Por cierto he vuelto a copypastear tal cual y me sigue sin pillar el size() :S

1 respuesta
B

#5 Con qué estás compilando? Me parece raro. A mí me compila sin problemas.

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -o mv mv.cc 
$ ./mv
Introduce el nombre de una mazmorra: Cuando termines de introducir datos pulsa 0hola que tal 0
$ 

Dios el compilador del año maría castaña

1 respuesta
Alberteban

#6 con Netbeans

edit: me acabo de acordar de que Netbeans es un IDE y no un compilador per sé, si mal no recuerdo sería el gcc++ o como se llame, el de cygwin

1 respuesta
B

#7 Cuándo compilas mi código qué errores te salen exactamente? Podrías hacer copypaste?

2 respuestas
Alberteban

#8 Vale he vuelto a probarlo después de un rato y aunque me sigue saliendo que no identifica a size() el programa compila y hace lo que busco. Muchas gracias por la ayuda, ahora me pondré a ver exactamente cómo funcionan esos parámetros del while que no conocía de su existencia.

Alberteban

#8 Por cierto cómo podría mostrar entonces el vector/array? Yo es que siempre he usado los arrays tal que nombre[] y no me había encontrado hasta ahora con esa forma de expresarlos. He probado con un cout<<vector <string> collar; pero no compila xD.

B

Pues de forma no muy diferente a los arrays con corchete:

for(int i = 0; i < int(collar.size()); ++i) {
  cout << collar[i] << " ";
}

O bien, en C++11 en adelante

for(string s : collar) {
  cout << s << " ";
}

Recomiendo usar vectores de C++ si se programa en C++. Aseguran 0 memory leaks y si compilas con flags de debug en algunos compiladores pueden chivarte cuando te sales de boundaries y similares, en lugar de dar error directamente.

1 1 respuesta
Alberteban

#11 Ahora sí que tengo solucionado este asunto, muchas gracias!

Usuarios habituales