2013-04-26 107 views
26

我正在閱讀來自cppreference的std::ignore文檔。我發現很難理解這個對象的真正目的,而示例代碼並沒有太多公正。例如,在下面的代碼中,爲什麼inserted設置爲true?這對我來說沒有多大意義。請解釋此代碼使用std :: ignore

#include <iostream> 
#include <string> 
#include <set> 
#include <tuple> 

int main() 
{ 
    std::set<std::string> set_of_str; 
    bool inserted; 
    std::tie(std::ignore, inserted) = set_of_str.insert("Test"); 
    if (inserted) { 
     std::cout << "Value was inserted sucessfully\n"; 
    } 
} 

如果有人可以向我解釋代碼,將不勝感激。謝謝。

+5

你明白'std :: tie'的作用,'std :: set :: insert'返回什麼? – Xymostech 2013-04-26 01:39:09

+0

@Xymostech我知道'tie'是幹什麼的。儘管我沒有想到「插入」。 – 2013-04-26 01:40:12

+0

'bool inserted = std :: get <1>(set_of_str。insert(「Test」));' – bames53 2013-04-26 15:15:14

回答

39

set::insert返回一對,其中第一個是插入元素的迭代器,第二個是布爾型,表示元素是否被插入。

std::tie創建一個左值引用的元組。當分配給insert的結果時,它使您能夠將tie中的變量設置爲返回pairfirstsecond成員中的插入結果。

std::ignore是一個可以分配的值,但不起作用。

因此,基本上,這個代碼忽略迭代到​​插入並asigns insertedset::insert返回的一對指示元素是否插入的second構件的元素。

17

我認爲戴夫的答案很不錯,但我想解釋一下爲什麼要使用這種方法。

在像斯卡拉,哈斯克爾或Python語言,你通常有元組(即對兩個元素的元組)的存在,他們必須將它們分配給變量這種習慣的方法:

(var1,...,varN) = func_returning_tuple() 

這目的是擴展你的代碼的語義值並提高他的可讀性,否則你會得到一個沒有語義的單個變量(比如t.first,等等),並且在C++中訪問元組的值必須使用:

varN = std::get<N>(my_tuple); 

所以,只用領帶,你可以讓你的示例代碼更易於閱讀如下:

std::tie(element_iterator, inserted) = set_of_str.insert("test"); 

然後隨意使用你的孤立的變量,這提高了其他的方式(甚至你自己)讀取的下一個發言你的代碼。

std::ignore用於在您不關心返回的內容時,在其他語言中您也有此資源,例如在Scala中,這是下劃線。例如,如果我在地圖中使用插入函數並且該值已經存在,則它只返回包含(iterator,false)的對,所以如果我想要某個鍵的迭代器,即使我不在乎它是否已經存在於地圖中,我可以這樣做:

std::tie(element_iterator, std::ignore) = set_of_str.insert("test"); 

這就是C++解決元組和對的可讀性問題的方式。

+2

這個模糊的FP如何回答這麼多upvotes,同時包含重複和明顯的語法錯誤?我希望這張海報在他的日常工作中不使用C++ ... – sehe 2013-05-03 09:08:18

+7

這真的有必要嗎?你一定是一個非常好的人一起工作。當你看到這樣的錯誤時,可以自由地使它成爲更好的答案。就是那種精神。 – 2013-05-03 14:34:53

+0

恰恰相反。我通常會悄悄地糾正錯誤。唉,我沒有這樣的機會(責備糟糕的電話連接),而且事情有(超過)3 upvotes。這似乎是一個很好的時刻**(提醒Twitter的選民有義務真正閱讀他們的內容)(https://twitter.com/isocpp/status/330056683906813952)... ** IOW我在批評選民,因爲批評了帖子就是按鈕的用途(我甚至沒有倒下,因爲我知道有人會在幾分鐘內解決明顯的疏忽,不重要) – sehe 2013-05-03 21:32:38