функция возвращает пустой вектор - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь вернуть вектор строк из функции, но каждый раз, когда я делаю это, я получаю пустой вектор. Однако когда я пытаюсь распечатать вектор в самой функции, он не пустой, но когда я пытаюсь напечатать возвращенный вектор Я ничего не печатал

#include <iostream>
#include <vector>

using namespace std;
vector<string> permute(string S, string chosen){
    vector<string> permutated_strings;
    if(S.empty())
        permutated_strings.push_back(chosen);
    else{
         for(int i=0;i<S.length();i++){
            char c = S[i];
            chosen += c;

            S.erase(i,1);
            permute(S,chosen);

            //backtrack
            chosen.erase(chosen.length()-1,1);
            S.insert(i,1,c);
        }
    } 
    return permutated_strings;
}

int main() {
    //code
    int test;
    cin >> test;
    while(test)
    {
        string S;
        cin >> S;
        vector<string> vec;
        vector<string> ::iterator i;
        vec = permute(S,"");
        for(i=vec.begin();i!=vec.end();i++)
            cout<<*i<<" ";
        cout << "\n";
        test--;
    }
    return 0;
}

Когда я печатаю вектор в функции перестановки, я получаю правильный результат, но когда я печатаю вектор в основной функции, он пуст. Может кто-нибудь указать мне на ошибку, которую я совершаю.

Ответы [ 2 ]

4 голосов
/ 02 июля 2019

Вам нужно сохранить результат рекурсивного вызова метода permute.

auto result = permute(S,chosen);
permutated_strings.insert(permutated_strings.end(), result.begin(), result.end());
0 голосов
/ 03 июля 2019

Я получил ошибку, которую делал.Я очень не хочу отвечать на свои вопросы, но это может помочь кому-то, как я, в будущем.

Я изменился -

vector<string> permutated_strings;

на

static vector<string> permutated_strings;

в перестановкефункция так, чтобы предыдущие возвращения от рекурсивных вызовов не были потеряны.Тем самым я получаю желаемый результат.

Спасибо всем, что указали мне на ошибку, которую я совершал.

РЕДАКТИРОВАТЬ

Как предполагает @MM, это решение может вызвать проблемы в будущем.И я понял, что если я задаю значение «test» как 2, окончательное значение в permutated_strings будет от test = 1 + test = 2, а это не то, что я хотел.Так что это решение не идеальное.Вместо этого я принимаю решение от @ BartekPL.

...