映射中循环的迭代器

Iterator for loop in map

本文关键字:迭代器 循环 映射      更新时间:2023-10-16

我尝试了以下代码,但找不到错误。错误在循环部分,但我无法弄清楚如何正确使用迭代器以避免错误。请帮忙,请澄清我的概念。 问题陈述 https://codeforces.com/contest/268/problem/A。我已经通过矢量解决了它

int main()
{
std::ios::sync_with_stdio(false);
int n,x,y,count=0; cin>>n;
std::vector<pair<int,int>> v;
for (int i = 0; i < n; ++i)
{
cin>>x>>y;
v.push_back(make_pair(x,y));
}
for (int i = 0; i < n; ++i)
{
for (int j=i+1; j < n; ++j)
{
if(v[i].f==v[j].s){
count++;
}
if(v[i].s==v[j].f){
count++;
}
}
}
cout<<count;

return 0;
}

但是通过地图有问题。 它在使用地图时给出 SIGTSTP 错误。

#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::make_pair;
int main() {
std::ios::sync_with_stdio(false);
int n, x, y, count = 0;
cin >> n;
std::map<int, int> m;
for (int i = 0; i < n; ++i) {
cin >> x >> y;
m.insert(make_pair(x, y));
}
for (auto i = m.begin(); i != m.end(); ++i) {
for (auto j = ++i; j != m.end(); ++j) {
if (i->first == j->second) {
count++;
}
if (i->second == j->first) {
count++;
}
}
}
cout << count;
return 0;
}

不能使用映射数据结构来解决此问题,因为映射以映射方式存储元素。每个元素都有一个键值和一个映射值。没有两个映射的值可以具有相同的键值。
但是根据问题,键值可以相同,所以这就是为什么你不能在这里使用map的原因。
有关更多详细信息,请参阅 http://www.cplusplus.com/reference/map/map/

这是我的答案:

#include <iostream>
#include <map>
const int N = 50;
int h[N], a[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", h + i, a + i);
}
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (i != j) {
if (h[i] == a[j]) ans++;
}
printf("%dn", ans);
return 0;
}

问题的答案是sigma { h[i] = a[j] } (i != j).

您的代码犯了以下错误:

  1. std::map::insert表示将某个键设置为某个值。另外,std::mapstd::multimap不同。后者允许存在多个相同的密钥,而前者则不允许。

  2. 您不应该只是将j的起点设为i + 1因为迭代范围应该[0, i - 1]并集[i + 1, n - 1](编辑:您的代码逻辑也是正确的(。

  3. 迭代器不能如此草率地自我增,因为它有副作用,正如评论部分指出的那样。