地图中的循环迭代器

时间:2019-12-26 13:06:01

标签: c++ c++11 stl iterator c++14

我尝试了以下代码,但找不到错误。错误在循环部分中,但是我无法弄清楚如何正确使用迭代器以避免错误。 请帮助,请阐明我的概念。 问题陈述是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;
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这是我的答案:

#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("%d\n", 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. 迭代器不能如此轻率地自我增加,因为它具有注释部分所指出的副作用。