2014-04-18 5 views
0

새로 생성 된 객체를 벡터에 푸시하려는 재귀 함수가 있습니다 (재귀를 통해 벡터가 참조로 전달됩니다).C++ : 재귀 함수에서 새 객체 만들기

그러나 재귀가 완료된 후에도 개체가 필요하며 개체가 로컬 변수이기 때문에 삭제되지 않습니다. 이것을 어떻게 성취합니까? 여기

내 코드의 출구 조건이 순간에없는 (base_pair 2의 정수만을 포함하지 않는 간단한 구조체는) 나중에 그것을 구현하는 것입니다 : 당신이 바로 그 아이디어를 가지고있는 것처럼

void Nussinov::traceback (int row, int col, std::vector< base_pair_type>& base_pairs, int dp_matrix[][_sequence.size()]){ 
    if(dp_matrix[row+1][col-1] == dp_matrix[row][col]){ 
     base_pair_type base_pair = {row,col}; 
     base_pairs.push_back(base_pair); 
     traceback(row+1, col-1, base_pairs, dp_matrix); 
     return; 
    } 
} 
+0

스택에 개체를 만들고 있습니까? –

+2

모든 재귀가 완료되고 벡터에 계속 액세스 할 수있는 경우 모든 요소에 액세스 할 수 있어야합니다. 실제로하고있는 것을 보여주는 코드 샘플을 제공해주십시오. – arunmoezhi

+2

@arunmoezhi에 동의합니다. ['std :: vector :: push_back'] (http://www.cplusplus.com/reference/vector/vector/push_back/)는 전달한 매개 변수를 복사하거나 이동합니다. 참조 (즉, 스택 변수)를 저장하지 않으므로 재귀가 완료 될 때 벡터가 계속 채워 져야합니다. – Lilshieste

답변

0

것 같습니다 나에게. std :: vector :: push_back은 로컬 변수의 복사본을 만들 것이므로 로컬 변수가 삭제되었는지는 중요하지 않습니다. I tried it out 그리고 제대로 작동하는 것으로 보입니다.

#include <iostream> 
#include <vector> 

typedef std::pair<int, int> int_pair; 
typedef std::vector< std::vector<int> > int_matrix; 

void traceback(int row, 
       int col, 
       std::vector<int_pair>& base_pairs, 
       int_matrix& dp_matrix){ 
    // bounds checking? 

    if(dp_matrix[row+1][col-1] == dp_matrix[row][col]){ 
    int_pair base_pair = {row,col}; 
    base_pairs.push_back(base_pair); 
    traceback(row+1, col-1, base_pairs, dp_matrix); 
    return; 
    } 
} 

int main() { 
    int_matrix dp_matrix{{4,3,2,1}, 
         {3,2,1,1}, 
         {2,1,2,3}, 
         {0,2,3,4}}; 
    std::vector<int_pair> base_pairs; 
    traceback(0, 3, base_pairs, dp_matrix); 
    for (auto& pair : base_pairs) 
    std::cout << pair.first << "," << pair.second << std::endl; 
}