如何在进行回溯时避免输出参数
How can i avoid output parameters while doing backtracking?
正如我们所知,输出参数对来说真的很糟糕
void foo(set<int> *x)
这里x实际上是预期的参数,这在Linux系统调用中非常常见。但对于c++来说,这似乎不是一个好的编码实践。
我有一个场景,我必须回溯字符串列表,并从每个列表中返回所有可能的字符串组合。
a b
d e
f g
Possible combinations are:
a d f, a d g, a e f, a e g, etc...
list<list<string> > parameters;
一个简单的回溯解决方案是:
void getCombinations(list<list<string> > ¶m,
list<list<string> >::iterator it,
vector<string> &backtracker,
list<vector<string> > &output){
if(it == param.end()){
output.append(backtracker);
}
for(auto i = it->begin; i!= it->end(); i++){
backtracker.push_back(*i);
getCombinations(param, it+1, backtracker, output)
backtracker.pop_back();
}
}
现在,我如何避免这里的输出参数,以便返回输出列表?
据我所知,输出参数是一种很好的做法,具体取决于您正在做什么。这就是指针或引用的作用。这就是为什么java或C#默认情况下对对象使用引用的原因。更好的性能,更易于使用等
编辑:如果你真的想这样做,你可以使用const引用作为输出参数。只要它是const引用,即使在代码中调用了被引用对象的析构函数,它也将保持活动状态。
您也可以像前面所说的那样正确地定义复制、移动构造函数(这意味着您需要在列表上创建一个包装类)。
输出参数始终显示在C++中。但是,您可以用这些方法封装输出数据结构。
class ComboGenerator {
public:
void getCombinations(list<list<string> > ¶m,
list<list<string> >::iterator it,
vector<string> &backtracker){
if(it == param.end()){
result.append(backtracker);
}
for(auto i = it->begin; i!= it->end(); i++){
backtracker.push_back(*i);
getCombinations(param, it+1, backtracker)
backtracker.pop_back();
}
}
list<list<string>> &getResult() { return result; }
private:
list<list<string>> result;
};
我的经验是,95%的时候,有人在谈论练习,这是个人的愤怒。其他5%的时间是很好的感觉。
相关文章:
- C++输出参数与返回值
- C++函子作为函数的输出参数
- 将ctypes c_void_p强制转换为c输出参数
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- 我可以将函数的输出参数存储到unique_ptr中吗?
- 在存在错误代码的情况下输出参数与 NRVO
- 具有输出参数的QT InvoKeMethod调用函数
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- jni jiniArray 作为输出参数不会更改参数的值
- 返回容器时删除输出参数
- 通过 API 填写"std::optional"<T>,获取输出"T*"参数
- 指针或局部变量,用于函数的输出参数
- 如何在输出参数中使用基类
- 值语义与具有大数据结构的输出参数
- 当输出参数是类时,如何在C++中调用COM方法
- 如何在不破坏现有代码的情况下将输出参数添加到功能
- stl数据结构的堆栈上输出参数与返回值的效率
- C# P/调用:本机输出参数值不会到达托管代码
- 在 C++11 中将结构作为输出参数传递
- 将字符串从 C# 方法返回到输出参数中的C++函数