将动态数组作为副本传递给递归函数 C++
passing an dynamic array as copy to recursive function c++
我正在为旅行推销员类型的问题编写回溯方法的代码。因此,在每个点上,我将递归其余未访问的点。
我无法使用除 cout、cin、new 和 delete 以外的任何库/函数(所以没有矢量)。因此,对于这个问题,我想跟踪到目前为止我访问过的所有点。我为此使用动态布尔数组。所以我想将动态数组作为值传递给函数以跟踪这一点。
这是我迄今为止尝试过的。我试图将数组包装在结构中,但内存取消分配(删除)出现错误(分段错误)
typedef struct Barray{
bool* a;
int size;
Barray(int size) { a = new bool[size]; this->size = size; }
Barray(const Barray& in) {
if(a) delete[] a; // error
a = new bool[in.size];
this->size = in.size;
for (int i = 0; i < in.size; i++)
a[i] = in.a[i];
}
~Barray() { delete[] a; } // error
}barray;
这是我的递归函数调用
void find_mindist(barray visited, int dist_now, int cur_p) {
if (base condition)
{return ;}
for (int i = 0; i < n; i++) {
if (visited.a[i]) continue;
barray tdist = visited;
tdist.a[i] = true;
int ndist = dist_now + dist(points[cur_p], points[i]);
find_mindist(tdist, ndist, i);
}
return ;
}
所以我的问题是——
- 如何将动态数组作为值传递给函数?
- 为什么上面的
delete
给出错误?
首先,对于本地访问的信息,推荐的方法不是无休止地复制整个访问的馆藏,而是mark->recurse->unmark
的方法。因此,无论您做什么,请为访问的信息保留一个布尔数组,并根据您的需要更新其内容。
出现其他问题是因为您尝试删除复制构造函数中未初始化的指针。此外,赋值运算符也应重载,以避免不愉快的意外。但是,如果您不再复制访问过的信息,这些都无关紧要。
问题是这是一个复制构造函数。 因此,在输入时,a
是未初始化的(因此包含垃圾),因此delete
无效。
Barray(const Barray& in) {
if(a) delete[] a; // error
a = new bool[in.size];
this->size = in.size;
for (int i = 0; i < in.size; i++)
a[i] = in.a[i];
}
只需删除delete
行即可。 此外,更喜欢初始化成员,而不是而不是分配它们,因此:
Barray(const Barray& in)
: a(new bool[in.size])
, size(in.size) {
for (int i = 0; i < in.size; i++)
a[i] = in.a[i];
}
另外,请记住三法则。 您需要一个复制赋值运算符。 最简单的是:
Barry& operator=(const Barray& in) = delete;
如果您尝试使用它,这只会强制出现编译错误! 更好的是:
Barry& operator=(const Barray in) { // **NOTE** pass by value!
std::swap(this.a, in.a);
std::swap(this.size, in.size);
}
此版本提供了强大的异常保证。 您不得使用std::swap
,因此您必须自己编写,或者手写(您可以选择)。
最后,如果你发现自己返回了一个 Barray,你应该编写一个移动构造函数:
Barray(Barray &&in)
: a(in.a)
, size(in.size) {
in.a = nullptr;
}
这样可以节省大量复制!
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数