2012-08-17 2 views
-1

Например:Как написать обобщенную функцию для вычисления рекурсивной комбинации

< 1,2,3> в качестве входного сигнала к функции гребню, чтобы получить комбинацию из 2-х элементов будут выводить результат < < 1,2>, < 1,3>, < 2,3 >>, что в качестве входных данных в той же функции получит < < < 1,2>, < 1,3 >>, < < 1,3>, < 2,3 >> , < < 1,2>, < 2,3 >>, который в качестве входа для той же функции получит ....

Логика такая же, только тип изменяется, поэтому ее можно сделать общим. я пытался написать что-то вроде этого:

template<typename V> 
vector<vector<vector<V>::const_iterator>> comb(const vector<V>){ 
    .... 

    while(next_combination(...)) 
    vector<vector<vector<V>::const_iterator>> results; 
    return results; 
} 

vector<string> input 
comb(comb(comb(input))); 

Но компилятора Keep жалуется не может вывести тип возвращающего значения, в.

Спасибо.

+0

Вы должны написать точный код (по крайней мере, подпись шаблона) и точный код ошибки. –

+0

@ DavidRodríguez-dribeas Извините, код уже испорчен, чтобы выполнить мою работу, я уже заменяю этот код в своем проекте на несколько быстрых грязных функций гребня. – YourBestBet

+0

На самом деле вам понадобится пробел между двумя '' 'внутри шаблона для объявления шаблона. есть разница между '>>' и '>>'. Интересно, почему ваш компилятор не жалуется. – xQuare

ответ

1

Возможно следующее поможет:

template <typename T> 
vector<vector<T> > comb(vector<T> v) 
{ 
    vector<vector<T> > result; 
    // may want to sort the input vector before iterating over the combinations 
    do { 
     result.push_back(v); 
    } while (next_combination(...)); 
    return result; 
} 

Примечание изменения:

  • Возвращаемое значение comb вектор векторов
  • Параметр comb не const, потому что next_combination изменения это
  • Существует много копий векторов внутри comb; все это копирование кажется необходимым
+0

Приведенный выше код работает, спасибо. Почему я использовал const_iterator, чтобы не копировать содержимое для перестановки или комбинации снова и снова, эта часть ** vector :: const_iterator **, похоже, полагается на вывод типа возврата, поэтому мой код не работал. – YourBestBet

Смежные вопросы