簡體   English   中英

std :: for_each over std :: set,C ++ 11

[英]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_typeT 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM