2013-08-22 34 views
0

正如我们知道的输出参数是非常糟糕的事情如何在回溯时避免输出参数?

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> > &param, 
      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

*我们知道输出参数是非常糟糕的事情*我们?你能否进一步解释你的意思?你把什么称为*输出参数*,为什么它不好? –

+0

有过这方面的讨论,你可以参考http://stackoverflow.com/questions/18157090/how-to-avoid-the-copy-when-i-return/了解更多关于它! – innosam

+0

因此,通过输出参数表示传递可修改的引用或指针,对吗?无论如何,在许多情况下,有些理由更愿意按价值回报,但这并不意味着输出参数会被抹黑。你仍然可以使用它们,如果在你的设计中它是有意义的,而且你已经有了它的实现,那就使用它。有些地方的输出参数是由编码准则规定的(例如,针对C++ 03编译器的商店) –

回答

0

据我所知,输出参数是一个很好的做法,取决于你在做什么。这就是指针或参考。这就是为什么java或C#默认使用对象引用的原因。更好的性能,更易于使用等等

编辑:如果你真的想这样做,但你可以使用一个const引用作为输出参数。只要它是一个const引用,即使引用对象的析构函数在代码中被调用,它也会保持活动状态。

如前所述,您还可以定义副本,正确地移动构造函数(意味着您需要在列表上创建一个包装类)。

+1

检查了这一点:http://stackoverflow.com/questions/18157090/how-to-avoid-the-copy-when-i-return/ – innosam

+0

指针通常不好(除非封装良好),这是C++没有java或C#(btw:C#和java只有指针) –

+0

...除了一些值类 –

1

输出参数始终在C++中显示。但是,您可以使用方法封装输出数据结构。

class ComboGenerator { 
public: 
    void getCombinations(list<list<string> > &param, 
    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%的时间是很好的意义。

+1

这让我想起另一个想法。使函数成为类的构造函数,并按如下所示使用它:GetCombinations(...).result()。如果NRVO没有发生并且不能依赖移动构造函数,那将是值得的。 –