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();
          }
         }

现在,我怎样才能在这里避免输出参数,以便我可以返回输出列表?

4

2 回答 2

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% 的时间是很好的感觉。

于 2013-08-22T20:20:33.960 回答
1

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

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

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

于 2013-08-22T19:57:03.463 回答