2013-08-22 70 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沒有發生並且不能依賴移動構造函數,那將是值得的。 –