如何使用基于范围的for循环修改映射中的值
How can I modify values in a map using range based for loop?
我有一个基于范围的for循环来迭代foobar
中的元素,如下所示:
#include <map>
#include <iostream>
int main()
{
std::map<int, int> foobar({{1,1}, {2,2}, {3,3}});
for(auto p : foobar)
{
++p.second;
std::cout << "{" << p.first << ", " << p.second << "} ";
}
std::cout << std::endl;
for(auto q : foobar)
{
std::cout << "{" << q.first << ", " << q.second << "} ";
}
std::cout << std::endl;
}
这段代码产生如下输出:
{1, 2} {2, 3} {3, 4}
{1, 1} {2, 2} {3, 3}
第一行被修改并在for循环中打印,第二行应该打印相同的修改值。为什么输出不匹配?对std::map
的更改是否仅在循环范围内有效?是否有一种方法,我不仅可以访问而且可以修改这些值?
此代码的运行版本可以在cpp.sh中找到。
EDIT:为了清楚起见,这里给出的示例经过了修改,以匹配接受的答案。
如果您想改变/修改容器,可以将auto
变为auto&
,例如:
#include <map>
#include <iostream>
int main()
{
std::map<int, int> foobar({{1,1}, {2,2}, {3,3}});
for(auto& p : foobar) {
++p.second;
std::cout << '{' << p.first << ", " << p.second << "} ";
}
std::cout << std::endl;
}
编译和输出
<>之前{1,2} {2,3} {3,4}之前生活例子
纯auto
是按值的(你得到一个副本)。使用auto&
注意,从 c++ 17开始,你可以使用结构化绑定:
for (auto & [key, value] : foobar)
std::cout << "{" << key << ", " << ++value << "} ";
我喜欢这种机制,因为key
和value
对于地图来说比p.first
和p.second
更容易读。
使用auto
关键字将每个值的副本发送到循环中。如果你想改变地图中的原始值,你需要使用auto&
。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环