[英]std::for_each over std::set, C++11
迭代向量工作:
std::vector<int> collection = {2, 3, 4, 5435345, 2};
std::for_each(collection.begin(), collection.end(), [](int& i){cout << i << endl;});
但不是一組(編譯錯誤):
std::set<int> collection = {2, 3, 4, 5435345, 2};
std::for_each(collection.begin(), collection.end(), [](int& i){cout << i << endl;});
為什么我不能用std::for_each
迭代std::set
?
額外問題:另外,我想將lambda的參數中的int&
改為auto&
,為什么不能自動推導出來?
std::set<T>::value_type
是T const
,而不是T
; 因此,lambda的參數必須是值類型(即copy)或int const&
(技術上或int const volatile&
),而不是int&
。 即,這工作:
std::set<int> collection{2, 3, 4, 5435345, 2};
std::for_each(
collection.begin(),
collection.end(),
[](int const& i) { std::cout << i << std::endl; }
);
額外問題:另外,我想將lambda的參數中的
int&
改為auto&
,為什么不能自動推導出來?
因為標准說它不能; 從歷史上看,我認為這是由於lambda和概念之間過於復雜的相互作用(在概念從草案中刪除之前)。
但是,我聽說有傳言說新的(C ++ 11)標准的第一個缺陷報告將完全解決這個問題,所以你可能會在未來一兩年內看到對你選擇的編譯器的支持。
編輯 :哦,看,C ++ 14現在有多態lambdas ...
關於獎金問題:“自動”函數參數不是特定於lambda。 您也可以問為什么我們不允許將所有函數聲明為f(auto x, auto y)
。 但這只是意味着您基本上想要通過功能模板替換所有功能。 這被認為與現有的C ++語言和特別是類型系統不兼容。 如果你想要一個函數模板,那么已經有了一個現有的語法和機制,並且聲明“自動”參數不是可行的方法。
解除引用的set<int>
迭代器是一個const int&
。 因此,如果沒有const
則無法將其作為int&
參數傳遞。 嘗試plain (int i)
或(const int& i)
。
這真的不是你被允許使用auto
的地方之一。 我認為auto
只能在帶初始值設定項的聲明中使用,或者作為尾隨返回類型的占位符。
你應該能夠迭代一套。 但是,請注意,由於集合中的元素也是其關鍵,因此無法修改。 更改您的代碼以獲取const
引用,並使用cbegin/cend
代替,無論是否是一個集合,當您不打算修改元素時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.