2014-01-30 59 views
1

我試圖初始化變量const&。我試圖初始化的變量的值取決於某些條件。
例如:const變量的複雜初始化,同時避免新的分配

typedef std::vector<string> string_vector; 
string_vector data_pool; 

const string& data; 
if(some_cond) 
    { 
    // do something and set data 
    data = data_pool[some_index1] 
    } 
else 
    { 
    // do something and set data 
    data = data_pool[some_index2] 
    } 

當然上面的代碼是無效的,但是這是我想要做的事。

我可以使用ternary operator

const string& data = (some_cond)? data_pool[some_index1] : data_pool[some_index2]; 

但是這句法並沒有真正讓我做以外的任何其他設置值。

所以現在我嘗試使用lambda expression(不太確定我猜中了):

const string& data = [&]{ 

    string tmp = ""; 
     { 
     // do something and set tmp 
     tmp = data_pool[some_index1] 
     } 
    else 
     { 
     // do something and set tmp 
     tmp = data_pool[some_index2] 
     } 

    return tmp; 
} 

但在這裏我的問題是,這種解決方案需要新的字符串分配我不能在這一點上,因爲買得起這段代碼是我程序的瓶頸。

問題
如何data以複雜的方式但有效被初始化?


我可以很輕鬆地解決這個問題。 data最終會參考data_pool中的某個項目,因此我需要做的就是計算所需的索引,然後初始化data。不過,我對解決方法不感興趣,而是對這個基本問題採用了一種優雅的技術/實踐。如果初始化比在矢量中計算一些索引複雜一點,該怎麼辦?

+4

使用函數。 –

+0

這個函數的簽名是什麼? – idanshmu

+0

'std :: string initString'。 'const'引用可以綁定到臨時。 –

回答

2

你可以使用函數或lambda來做到這一點。兩種解決方案都可以完成,因此不會執行分配,並且const引用實際上會混淆data_pool中的數據。

與函數,那會是:

const std::string& initConstString(string_vector& pool){ 
    std::size_t index; 

    //complex initialization stuff 

    return pool[index]; 
} 

隨着拉姆達:

auto lambda = [&data_pool]() -> const std::string&{ 
    std::size_t index = 0;//For the sake of example 
    //perform initialization here 
    return data_pool[index]; 
}; 

const std::string& constString = lambda(); 

Live example for the lambda version on Coliru

我個人比較喜歡的功能,如果初始化代表很多(好,> 4-5行),因爲我喜歡我的lambda簡潔明瞭,但這取決於你。