std::map
的在遍历循环中 auto&
和 auto
的区别
#include <map>
#include <iostream>
using namespace std;
int main()
{
map<int,int> t={{1, 111}, {2, 222}, {3, 333}};
for (auto& p : t)
std::cout << p.second << ' '; //打印 map
std::cout<<std::endl;
for (auto p : t)
p.second++; //auto 加1
for (auto& p : t)
std::cout << p.second << ' '; //打印 map
std::cout<<std::endl;
for (auto& p : t)
p.second++; //auto& 加1
for (auto& p : t)
std::cout << p.second << ' '; //打印 map
std::cout<<std::endl;
return 0;
}
输出:
111 222 333
111 222 333
112 223 334
结论
for (auto& element1 : map)
会遍历map容器,并循环返回每个元素的 引用
for (auto element2 : map)
会遍历map容器,并循环返回每个元素的 拷贝
所以对于element1
的修改会直接影响到map
,对element2
的修改不会影响到 map
关于 map.erase(key)
的使用
#include <map>
#include <iostream>
using namespace std;
int main()
{
map<int,int> t={{1, 111}, {2, 222}, {3, 333}};
for (auto& p : t)
std::cout << p.second << ' '; //原始打印
std::cout<<std::endl;
t.erase(4); //删除不存在的 key
for (auto& p : t)
std::cout << p.second << ' '; //原始打印
std::cout<<std::endl;
t.erase(2); //删除存在的 key
for (auto& p : t)
std::cout << p.second << ' '; //原始打印
std::cout<<std::endl;
return 0;
}
输出:
111 222 333
111 222 333
111 333
结论
map.erase(key)
在尝试删除容器中不存在的key时,不会影响 map