Pregunta

No hay duda de que algunos de ustedes han visto mi anuncio reciente, todo en relación con el mismo programa. Sigo corriendo a tener problemas con él. Para reiterar: todavía está aprendiendo, no muy avanzada, no entiendo muy bien punteros, no tomar una clase, no entienden los conceptos de POO en absoluto, etc. Este código sólo se fusiona dos vectores ordenados, farray y sarray, ordenados en una sola vector. Al menos, espero que eso es lo que hace. Dime:

    //int num is to find the size of the original vector and
    //build up farray and sarray; not used in the merge process
    int num = original.size() 
    std::vector<int> final;

    std::vector<int>::iterator it = farray.begin();
    std::vector<int>::iterator iter = sarray.begin();

    //farray.size() == (0 thru (num / 2))
    //sarray.size() == ((num / 2) thru num)
    for (;it != farray.end() && iter != sarray.end();) {
        if (*it > *iter) {
            final.push_back(*it);
            it++;
        }    
        else
        {
            final.push_back(*iter);
            iter++;
        }

            if (it == farray.end()) {
                for (int i = 0; iter < sarray.end(); i++) {
                    final.push_back(*iter);
                }
            }

            if (iter == sarray.end()) {
                for (int i = 0; it < farray.end(); i++) {
                    final.push_back(*iter);
                }
            }
        }

He reescrito la pieza de mezcla de mi función de combinación de clase con el fin de ... bueno, hacer que funcione. De hecho tengo varias preguntas sobre este código:

  1. ¿Es buena forma de comparar contra std :: vector :: iteradores que && iter para mi último dos sentencias if si el bucle for puede cambiarlos en su próximo paso?
  2. ¿Los valores de ITER y que cambiar el último paso de este bucle y arruinar mi código? Va poniendo mi último si las declaraciones anteriores a la * y * Comparación iter?
  3. ¿Tiene la función de elemento de extremo () se refieren al último valor de lo que se llama ella? Parece como que podría extenderse más allá de algún modo.

EDIT: Voy a responder a todas las respuestas de mañana, a fin de comprobar entonces si quiere escuchar más. Es más de medianoche. Buenas noches.

¿Fue útil?

Solución

1. Está bien para comparar los iteradores que son del mismo recipiente como para la condición del bucle, pero esto sólo tiene sentido si se está moviendo uno o más iteradores, ya sea en la parte de la subasta si la instrucción de bucle o en el cuerpo del bucle en sí. En este bucle se compara contra iter sarray.end() pero el lazo para iter nunca cambia. Esto significa que, o bien no habrá iteraciones o el bucle nunca se terminará. Además, es probable que desee utilizar != y no < para la comparación. == y != trabajo para todos los iteradores, < no lo hace.

            for (int i = 0; iter != sarray.end(); i++) {
                final.push_back(*iter);
            }

A medida que se inicia iter en la que desea que el bucle se comienzan, es posible que desee algo como esto:

            for (; iter != sarray.end(); ++iter) {
                final.push_back(*iter);
            }

A medida que usted todavía está aprendiendo (aunque no estamos todos!), Es probable que sea instructivo trabajar a través de un algoritmo de este tipo, pero debe ser consciente de que probablemente std::merge hace lo que quiere.

std::merge( farray.begin(), farray.end(), sarray.begin(), sarray.end(), std::back_inserter( final ) );

(Es necesario #include <iterator> y <algorithm>.)

2. No veo incrementar iter o en el exterior para el lazo que invalida la lógica de la tarde para los bucles, en el punto 1. a un lado.

3. end() puntos a uno más allá del final de un contenedor, por lo que se puede utilizar para el control de terminación del bucle, pero no se debe tratar de eliminar la referencia de un iterador que es "==" a ".end()".

Otros consejos

no el registro aplicación de su algoritmo, sólo voy a referir a sus tres preguntas:

  1. Los iteradores son muy parecidos a los punteros a valores de un contenedor. Es exactamente igual que el uso de size_t i ++ y luego i en el bucle. se sentiría que es problemático para comparar farray [i] con sarray [i]? Probablemente no, por lo tanto, no pasa nada.
  2. ¿Qué te veo haciendo en su código aquí, es que usted acaba de leer los valores de * y * iter, en realidad no los cambie, por lo tanto, no va a cambiar.
  3. El extremo () apunta a un lugar no válida. No apunta al último valor, pero que "después". Es como "NULO" si se quiere, por lo tanto, si (iter == sarray.end ()) es verdadera, se bloqueará si usted va a escribir * iter, porque no se puede eliminar la referencia de un iterador que es igual a terminar ().

Algunos consejos generales: Es necesario pensar en los nombres de variables. Llamar a sus iteradores 'que' y 'iter' va a confundir en algún momento. En realidad, si se mira de cerca, que ya tiene. Si 'farray' y 'sarray' son nombres significativos, ¿qué tal 'fiter' y 'retratado'.

Además, pensar en lo que la fusión especie está haciendo. Esos dos últimos bloques están allí sólo para "vaciar" el que sea iterador tiene algunas cosas izquierda. Por lo que no necesitan estar en el primer bucle.

probablemente me escribo como (pseudocódigo):

while not (list1.empty and list2.empty):
    if list1.empty:
        result.push(list2.pop)
    else if list2.empty:
        result.push(list1.pop)
    else if list1.top > list2.top:
        result.push(list2.pop)
    else:
        result.push(list1.pop)

O en un tanto oxidada C-carga culted ++:

std::vector<int>::iterator fiter = farray.begin();
std::vector<int>::iterator siter = sarray.begin();

while (fiter != farray.end() || siter != sarray.end()) {
    if (fiter == farray.end())      final.push_back(*siter++);
    else if (siter == sarray.end()) final.push_back(*fiter++);
    else if (*fiter > *siter)       final.push_back(*siter++);
    else                            final.push_back(*siter++);
}

Usted tiene algunas cosas en que pensar aquí.

En primer lugar, si está fusionando dos rangos que sería mucho mejor usar el std :: fusionar función más que rodar su propia cuenta.

Su código es un poco difícil de leer porque utiliza diferentes estilos para el sangrado y dónde cabo sus llaves. Elegir un estilo y se adhieren a ella.

La primera parte de su ciclo for parece ser una aplicación correcta de una fusión:

for (;it != farray.end() && iter != sarray.end();) {
    if (*it > *iter) {
        final.push_back(*it);
        it++;
    }    
    else
    {
        final.push_back(*iter);
        iter++;
    }

... y esto debería ser todo lo que necesita para hacer el trabajo.

La segunda parte de su bucle tiene un par de problemas:

   for (;it != farray.end() && iter != sarray.end();) {
         :   :
            if (it == farray.end()) {
                for (int i = 0; iter < sarray.end(); i++) {
                    final.push_back(*iter);
                }
            }

            if (iter == sarray.end()) {
                for (int i = 0; it < farray.end(); i++) {
                    final.push_back(*iter);
                }
            }
        }

Por una parte, los condicionales para () se escriben de forma que tanto it y iter no debe apuntar a la end() de su respectiva colección, o bien los extremos de bucle. Así it nunca puede apuntar a sarray.end(), iter nunca puede apuntar a farray.end(), y ni declaración if nunca puede disparar. Ellos están muertos código (inalcanzable).

Pero incluso si no estaban código muerto, tienen errores. El condicional en el for(...) rompe el bucle cuando los puntos de iterador al final de la colección, pero este iterador no se mueve, por lo que tiene un bucle infinito.

De nuevo ambos de estos for(...)s están uneeded código muerto porque los iteradores nunca pueden apuntar a la final del vector.

Una simple comentario:. while (condition) por qué no usar en lugar de for(; !condition; )

La última construcción es no estándar y difícil de entender!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top