#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, int> ma;
// 원소를 추가 하자!!
ma.insert(make_pair(100, 2)); // key 값 : 1 , value : 3
ma.insert(make_pair(101, 3)); // key 값 : 3, value : 13
ma.insert(make_pair(102, 2)); // key 값 : 3, value : 13
ma.insert(make_pair(103, 3)); // key 값 : 3, value : 13
ma.insert(make_pair(104, 1)); // key 값 : 3, value : 13
// make_pair 형식으로 저장 했으므로
// key 값은 fisrt 로 접근 value 값은 second 로 접근한다.
for (auto iter : ma) {
cout << "key : " << iter.first << " value : " << iter.second << 'n';
iter.second = iter.second + 1;
}
cout << "n" << "n";
for (auto iter : ma) {
cout << "key : " << iter.first << " value : " << iter.second << 'n';
}
cout << "n" << "n";
return 0;
}
实际上,我想改变pair的第二个分量的值。
iter.second = iter.second + 1;
这段代码不能改变的东西…我怎样才能改变??
c++中的auto
关键字总是试图推断非引用类型,因此在您的情况下,它推断iter
为std::pair<const int, int>
类型。这不是引用类型,因此映射中的值会被复制到到iter
变量中,因此对iter
所做的任何更改都不会反映在映射本身中。
你可以写auto&
来强制使用左值引用类型:
for (auto& iter : ma) { // <-- Notice ampersand here
iter.second = iter.second + 1;
}
您的主要问题是您将变量称为" iter"所以你一定认为它是某种迭代器。如果它是一个迭代器,您的代码将正常工作:
#include <iostream>
#include <map>
int main() {
std::map<int, int> map {
{100, 2}, {101, 3}, {102, 2}, {103, 3}, {104, 1},
};
for (auto iter = map.begin(), end = map.end(); iter != end; ++iter) {
std::cout << "key : " << iter->first << " value : " << iter->second << 'n';
++(iter->second);
}
std::cout << "nn";
for (auto iter = map.begin(), end = map.end(); iter != end; ++iter) {
std::cout << "key : " << iter->first << " value : " << iter->second << 'n';
}
std::cout << "nn";
}
(见在线)
但是由于您使用的是基于范围的for循环,因此您访问的是值本身,而不是对它们的迭代器。在这种情况下,如果您使用auto
,您将获得元素的副本,并且您所做的任何更改都是在副本中完成的,而不是元素本身。如果你使用auto&
,你会得到一个引用,这就是你想要的:
#include <iostream>
#include <map>
int main() {
std::map<int, int> map {
{100, 2}, {101, 3}, {102, 2}, {103, 3}, {104, 1},
};
for (auto& [key, val] : map) {
std::cout << "key : " << key << " value : " << val << 'n';
++val;
}
std::cout << "nn";
for (auto& [key, val] : map) {
std::cout << "key : " << key << " value : " << val << 'n';
}
std::cout << "nn";
}
(见在线)
请注意使用结构化绑定来简化代码。