C++:在递归函数中创建新对象

C++: Create new objects in recursive function

本文关键字:对象 新对象 创建 递归函数 C++      更新时间:2023-10-16

我有一个递归函数,我想把新创建的对象推到一个向量中(在整个递归过程中,向量是通过引用传递的)。

但在递归完成后,我需要对象仍然存在,并且不会被删除,因为它们是局部变量。我该如何做到这一点?

这是我的代码(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;
    }
}

我觉得你的想法是对的。std::vector::push_back会复制局部变量,所以删除局部变量并不重要。我试了一下,结果似乎很好:

#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;
}