是否有 C 11 和 C 17 基于范圍的 For 回圈迭代器版本可以迭代到地圖中的某個位置?例如,如果一個地圖有 10 個鍵值元素,那么我如何只遍歷前三個鍵值元素呢?以下代碼僅遍歷整個地圖范圍。
//C 11
for(auto m: mapData){
cout << m.first << ": " << m.second << endl;
}
//C 17
for(auto [key, val]: mapData){
cout << key << ": " << val << endl;
}
uj5u.com熱心網友回復:
您要么需要一個外部計數器來提前退出,例如:
int n = 0;
for(auto [k, v] : map)
{
if( n > 10) break;
std::cout << k << ": " << v << std::endl;
}
或者,如果你不怕復制地圖,你可以這樣做:
std::map<...> copy { map.begin(), std::next(map.begin(), 10) };
for(auto [k, v] : copy) std::cout << k << ": " << v << std::endl;
最后,如果你可以使用 C 20,那么你可以簡單地這樣做:
#include <ranges>
for(auto [k, v] : map | std::views::take(10))
{
std::cout << k << ": " << v << std::endl;
}
uj5u.com熱心網友回復:
基于范圍的 for 回圈只是普通begin()和end()呼叫的語法糖。std::map您的部分迭代請求由于沒有隨機訪問迭代器這一事實而變得復雜——這會導致每個迭代器遞增的成本。
為了避免多余的成本,您最好的選擇是向我們提供基于范圍的 for 回圈到特定計數器,其中包含break:
auto count = 0;
for (const auto& [k,v] : map) {
if ( count > n) { break; }
// process 'k', 'v'
}
如果您正在尋找“標準”方法,您可以使用std::for_each_nwhich 讓您選擇長度。您只需要確保計數不超過容器的長度:
auto length = std::min(map.size(), n);
std::for_each_n(map.begin(), n, [&](const auto& kv) {
// process kv
});
盡管該std::for_each_n方法在很大程度上等同于帶有計數器的第一種方法。
如果你擴展支持c 20,你的選擇有點開放,因為你可以構造一個std::ranges::subrange:
for (const auto& [k,v] : std::ranges::subrange(map.begin(), std::advance(map.end(), n)) {
// process 'k', 'v'
}
這種方法的缺點是std::map迭代器不是隨機訪問的——這意味著您要支付兩次迭代序列的成本。在大多數情況下,僅僅嘗試利用基于范圍的for回圈并不值得。
編輯:請參閱@InnocentBystander 的答案std::views::take(...)作為替代方案,這將有效地產生與基于count break的方法等效的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438737.html
下一篇:在浮點值中獲得平方根的最快方法
