問題描述
C++11 基于范圍的 for() 循環的常見示例總是像這樣簡單:
The common example for C++11 range-based for() loops is always something simple like this:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
在這種情況下,xyz
是一個 int
.但是,當我們擁有地圖之類的東西時會發生什么?這個例子中變量的類型是什么:
In which case xyz
is an int
. But, what happens when we have something like a map? What is the type of the variable in this example:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // ? should this give a foo? a bar?
std::cout << abc->first << std::endl; // ? or is abc an iterator?
}
當被遍歷的容器很簡單時,看起來基于范圍的 for() 循環會給我們每個項目,而不是迭代器.這很好……如果是迭代器,我們總是要做的第一件事就是取消引用它.
When the container being traversed is something simple, it looks like range-based for() loops will give us each item, not an iterator. Which is nice...if it was iterator, first thing we'd always have to do is to dereference it anyway.
但我對地圖和多地圖等內容的期望感到困惑.
But I'm confused as to what to expect when it comes to things like maps and multimaps.
(我仍然使用 g++ 4.4,而基于范圍的循環使用 g++ 4.6+,所以我還沒有機會嘗試它.)
(I'm still on g++ 4.4, while range-based loops are in g++ 4.6+, so I haven't had the chance to try it yet.)
推薦答案
容器的每個元素都是一個 map
,也就是一個 typedef
code> 用于 std::pair
.因此,在 C++17 或更高版本中,您可以編寫
Each element of the container is a map<K, V>::value_type
, which is a typedef
for std::pair<const K, V>
. Consequently, in C++17 or higher, you can write
for (auto& [key, value]: myMap) {
std::cout << key << " has value " << value << std::endl;
}
或作為
for (const auto& [key, value]: myMap) {
std::cout << key << " has value " << value << std::endl;
}
如果您不打算修改這些值.
if you don't plan on modifying the values.
在 C++11 和 C++14 中,您可以使用增強的 for
循環來單獨提取每一對,然后手動提取鍵和值:
In C++11 and C++14, you can use enhanced for
loops to extract out each pair on its own, then manually extract the keys and values:
for (const auto& kv : myMap) {
std::cout << kv.first << " has value " << kv.second << std::endl;
}
如果您想要值的只讀視圖,您也可以考慮標記 kv
變量 const
.
You could also consider marking the kv
variable const
if you want a read-only view of the values.
這篇關于如何在 std::map 中使用基于范圍的 for() 循環?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!