如何更改地图的第二个组件?


#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关键字总是试图推断非引用类型,因此在您的情况下,它推断iterstd::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";
}

(见在线)

请注意使用结构化绑定来简化代码。

相关内容

最新更新