¿Dónde me equivoco en el programa dado?

Aquí está mi programa para encontrar todos los subconjuntos de un conjunto dado. Para resolverlo, usé la recursividad. Pero cuando lo compilé en Windows en Codeblocks. Da

Esta aplicación ha solicitado que Runtime la termine de una manera inusual.

y en el compilador gcc no mostró ninguna respuesta, ninguna respuesta.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> findAllSubset(char c, vector<string> v) {
    int size = v.size();
    if(size == 1) {
        v.push_back("");
        return v;
    }
    c = v[size-1][0];
    v.pop_back();
    v = findAllSubset(c, v);

    for(int i = 0; i < v.size(); i++) {
        string s= "";
        if(v[i].size() == 0){
            s += c;
            v.push_back(s);
        }
        else {
            s += v[i] + c;
            v.push_back( s );
        }
    }
    return v;
}

main() {
    vector<string> v, ans;
    char c = 65;
    v.push_back("a");
    v.push_back("b");
    //v.push_back("c");
    //v.push_back("d");
    ans = findAllSubset(c, v);
    return 0;
}

preguntado el 12 de junio de 12 a las 10:06

Realmente no deberías pasar vector<string> por valor. -

Entonces, ¿cómo puedo pasar un conjunto de cadenas? -

Mediante el uso referencia. Además, si realmente te refieres a establecer, hay std::set<> envase. Realmente no entendí su algoritmo allí, pero ciertamente su uso de la biblioteca estándar es ineficiente. -

El primer problema aquí es que el flujo del programa en la función está lejos de ser obvio. Incluso sin errores, esto sería una pesadilla para mantener. Su primer paso debe ser hacer que la lógica sea obvia, tanto en su cabeza como luego traducida en código. Esto probablemente también aclarará el error. -

@BartekBanachewicz, no se llama STL, ¿está bien? stackoverflow.com/questions/5205491/… -

3 Respuestas

El bucle for es un bucle infinito, cada vez que un elemento se empuja hacia atrás en el vector, el tamaño del vector aumenta haciendo que la condición i < v.size() sea siempre cierta.

Respondido el 12 de junio de 12 a las 11:06

Sigues empujando cadenas a tu vector mientras lo recorres. Existe el bucle infinito. Por lo general, es una mala idea alterar un contenedor mientras lo recorre.

Respondido el 12 de junio de 12 a las 11:06

Bueno, si tuviera algún tipo de afirmación sobre cuándo terminar el ciclo, su ciclo sería perfectamente válido, ya que usa índices, no iteradores, y solo agrega elementos a su vector. Pero sí, el problema es que no existe tal afirmación. - Grives

Parece que hay un bucle infinito. El programa se compila y se ejecuta normalmente, pero nunca sale.

Respondido el 12 de junio de 12 a las 10:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.