我们知道输出参数确实很糟糕
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();
}
}
现在,我如何在这里避免输出参数,以便我可以返回输出列表?
答案 0 :(得分:1)
据我所知,输出参数是一种很好的做法,取决于你正在做什么。这就是指针或引用的用途。这就是为什么java或C#默认使用对象的引用。更好的表现,更容易使用等等。
编辑:如果您确实想要这样做,可以使用const引用作为输出参数。只要它是一个const引用,即使在代码中调用了引用对象的析构函数,它也将保持活动状态。
您也可以正确定义副本,移动构造函数(意味着您需要在列表上创建包装类),如前所述。
答案 1 :(得分:1)
输出参数一直在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%的时间都是很好的感觉。