c++ - 回溯时如何避免输出参数?

标签 c++ backtracking rvo

众所周知,输出参数真的很糟糕

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

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

最佳答案

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

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

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

关于c++ - 回溯时如何避免输出参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18389628/

相关文章:

c++ - OpenCV 加载 CIE L*a*b* 图像

java - 为什么从方法内部调用时方法回溯不起作用

c++ - 我的骑士之旅算法可能在无限循环中运行

c++ - 如果我们有 (N)RVO,何时实际调用 move 构造函数?

c++ - 返回临时的右值作为值

c++ std::move 在这里不好吗?

c++ - 在没有窗口的windows桌面上绘制OpenGL

c# - UDP 套接字 : recvfrom() returns -1 (SOCKET_ERROR)

c++ - Csinglelock有什么用?

Prolog、失败且不回溯