Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Orubatosu

#6151
Ahaha... claro, esto es "lo mismo"... está claro.
#6152
Técnicamente si... pero si pongo el it=v.erase(it); también me explota.

Estoy por probar (ahora no, que voy a cenar) el no utilizar un bucle for, sino un while e incrementar SOLO si no se borra, a ver que pasa.

Un apunte... veamos un caso simple:


int main() {
    vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8};
    vector<int>::iterator it = A.begin();
    cout << *it;
    A.erase(it);
    cout << *it;
}


Primera salida: "1"... eso es obvio
Borramos la casilla "1"
El contenido del iterador, es ahora "2"

Pero, pero al llegar al terminar  un bucle "for", el valor del iterador se incrementará nuevamente, pasando a contener "3".

Esto no daría ningún problema, ya que al terminar el bucle, el iterador estaría apuntado no la última casilla del vector, sino a A.end();

Pero, si hacemos un nuevo borrado, incrementamos en 1, y luego el bucle en 1 mas... y terminaremos el bucle con el iterador fuera de los límites del vector.

Esa es mi teoría... ¿ideas?... por eso cuando borra, añado un it-- para compensarlo

#6153
No.. me da error también. El poner el it-- aparentemente arregla el problema, al menos he modificado datos del vector inicial con mas números, y funciona perfectamente.
#6154
No, no me funciona, me sigue dando el mismo error.

Además, creo que esto no es así, según la documentación

http://www.cplusplus.com/reference/vector/vector/erase/

Citar
Return value
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.

Es decir: La operación me devuelve un iterador señalando a la posición que sigue al último elemento eliminado. Este será el contenedor "end" si la operación borra el último elemento.

Por otro lado, fíjate en que me borra sin problemas el primer elemento del vector, y tras eso es sometido a varias operaciones de incremento, también sin errores.

Actualizo: Tras hacer varias pruebas mas, veo que el programa me da un error al borrar un segundo elemento del vector, este puede ser contiguo al primero, no tiene porque ser el último.

Modifico el encabezado del post para hacerlo mas coherente con el problema

Y ojo, el copiar ese vector a otro no me ha solucionado el problema ¿?¿?

ACTUALIZO DE NUEVO

Bueno... esto no me lo esperaba... y está solucionado.

Parece que se me ha pasado por alto lo obvio... al borrar un elemento, reduzco la longitud del vector, pero el iterador continua incrementando su valor.

En un concepto un poco "lioso"... pero aparentemente al reducir en una unidad el tamaño, el iterador pasa a la siguiente casilla, pero el bucle lo incrementa nuevamente. No se si me explico bien.

Lo he solucionado de esta manera:


    for (; it!=v.end(); it++){
      dist = abs (medvec - *it);
      if (dist > med){
        v.erase(it);
        it--;
        }
      }


Lo que no tengo tan claro, es si esto es porque mi compilador se está "colando" por algún sitio, o porque en realidad esto es lo que se supone que debemos de hacer.

Especulaciones y explicaciones (si las hay) a partir del punto . <-- (Ese punto)
#6155
Bueno... lo reconozco, no se que he hecho mal


    it=v.begin();
    double dist;
    for (; it!=v.end(); it++){
      dist = abs (medvec - *it);
      if (dist > med) v.erase(it);
      }


Os pongo en antecedentes, esto es sencillo.

Tengo un vector de números reales, y pretendo borrar del mismo los que estén a mas de una distancia específica de la media. No parece problemático, pero ahaha...

El error me aparece en esta línea:


if (dist > med) v.erase(it);


Supongamos 5 valores: 1.0, 2.0, 3.0, 4.0, 5.0

Los valores que cumplen con la condición del if son el primero y el último

El primero es borrado, pero cuando el programa llega a intentar borrar la última posición del vector, simplemente "revienta".

Si cojo en otra parte del programa, creo un iterador para ese vector, lo posiciono en la posición del "5.0" y hago un erase(it)... funciona, no me da el problema.

Precisamente al usar iteradores, asumo que este nunca va a ponerse fuera de rango, ya que en el bucle if especifico claramente que "mientras it != v.end() con lo que no puedo suponer (en principio) que estoy intentando borrar una casilla inaccesible del vector.

He hecho algunas comprobaciones obviamente, y si por ejemplo limito el bucle a una vuelta menos ( it != v.end()-1) entonces el programa funciona sin errores, y se para tras llegar al "4.0"

El problema llega a la hora de intentar borrar la última casilla, cosa que aparentemente si puedo hacer "a lo bruto".

Si cambio el "erase" por un "cout << *it" veo que efectivamente, los números que cumplen la condición son los adecuados.

La verdad es que estoy atascado y no tengo claro que es lo que falla.
#6156
Claro que tiene justificación, solo que no para ti. Es una justificación religiosa.

Podemos hacer dos cosas, una es ayudar a estos países y culturas para que evolucionen desde su situación actual hasta una mas moderna y abandonen determinadas practicas, o las cambien para convertirlas en otras mas correctas moralmente

O podemos simplemente sentarnos y llamarlos "bárbaros ignorantes" y nada mas.

Por cierto, la enorme mayoría de todas las practicas religiosas, pueden ponerse fácilmente bajo el letrero de "estúpidas", ya que no son mas que rituales sin consecuencias reales.

Yo prefiero ver esto como algo lamentable, pero que en lugar de pretender prohibir (algo complicado la verdad) debería de cambiarse educando a esa población. Es mas lento, pero mas seguro
#6157
En realidad no... es perfectamente legal tener dinero en Suiza si lo tienes declarado, y tiene ciertas ventajas.

Una de ellas es tener tu dinero en una divisa fuerte que no baja fácimente de valor, o la capacidad de mover ese dinero por todo el mundo sin muchos tramites, incluso legalmente por supuesto.
#6158
Software / Re: [Ayuda] Bajar ping a LoL
3 Diciembre 2014, 11:18 AM
Creo que tienes un error de concepto. El "ping" es el tiempo que tarda una señal en llegar desde tu ordenador hasta el servidor del juego en cuestión, y no depende de si tienes o no un antivirus u otros programas, sino de como gestione tu conexión tu ISP.

Tu envías un dato, y ese dato está enviado... el que tarde mas o menos en llegar ya no depende de ti, de si tienes o no firewall, antivirus, etc. Depende de la infraestructura que use tu proveedor de internet y de muchos otros factores, pero no hay nada que puedas hacer en principio desde tu ordenador para aumentarlo o disminuirlo.

Otro tema diferente es que cierres mas o menos programas para que el juego se ejecute mas o menos rápido en función de los recursos que tenga tu máquina libre.

A menos que me equivoque mucho, claro está
#6159
A mi esa línea me compila y funciona sin problemas ni errores, claro que estoy usando un compilador moderno (MinGW 64)

No obstante, si lo que quieres es almacenar un texto (0-130) ¿no sería mas simple usar una variable de tipo string?
#6160
Cita de: valencia456 en  3 Diciembre 2014, 10:37 AM
habría que prohibir que se mate animales en cualquier parte del mundo,aunque eso suponga que solo comamos vegetales.

Ahaha... porque lo dices tu ¿no?... eso en mi pueblo tiene un nombre