【问题标题】:C++: Create new objects in recursive functionC ++:在递归函数中创建新对象
【发布时间】:2014-04-19 07:18:00
【问题描述】:

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

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

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

【问题讨论】:

  • 你是在堆栈上创建对象吗?
  • 当所有递归都完成后,如果你仍然可以访问向量,那么你应该能够访问它的所有元素。请提供一个代码示例来展示你真正在做什么。
  • 我同意@arunmoezhi。 std::vector::push_back 复制或移动您传递给它的参数。由于它不存储引用(即堆栈变量),因此在递归完成时仍应填充向量。
  • 对象base_pair 的副本将在base_pairs base_pairs.back() 中,究竟是什么工作不正常?
  • 最后一件事,是declype(_sequence)::size() constexpr?因为否则你会过得很糟糕。

标签: c++ recursion


【解决方案1】:

看来你的想法对我来说是正确的。 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;
}

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2018-06-12
    • 1970-01-01
    • 2020-09-20
    • 2012-05-31
    • 2010-11-21
    • 2011-01-10
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多