C 中MAP的反向迭代错过了第一个元素

reverse iteration of map in c++ missing out the first element

本文关键字:迭代 错过了 第一个 元素 MAP      更新时间:2023-10-16

我有一个代码,在该代码中,我正在逆转C 中的地图。对于地图中的n对,有时地图会打印出n对,有时是n-1对。对于测试用例

4 2    
2 1  
3 5  
2 3  
1 5 

它打印4个hi,对于下一个情况3 hi

4 1  
0 2  
0 3  
3 5  
0 6  

我的代码:

include cmath, cstdio, vector, iostream, map, algorithm, using namespace std;
int main() {
    int n,f;
    cin >> n >> f;
    int k[n],l[n],dif[n];
    map<int,int> m;
    map<int,int>::reverse_iterator it;
    for (int i=0;i<n;i++){
        scanf("%d %dn",&k[i],&l[i]);
        dif[i] = l[i]-k[i];
        m.insert(make_pair(dif[i],l[i]));
    }
    int a = 0;
    int sum = 0;
    for(it = m.rbegin(); it != m.rend(); ++it ) {
        cout << "hi" << endl;
        int article = it->second - it->first;
        int people = it->second;
        if (a < f and article!=0){
            a++;
            if (2*article > people){
                sum = sum + people;
            } else {
                sum = sum + (2*article);
            }
        } else {
            if (article > people){
                sum = sum + people;
            } else {
                sum = sum + article;
            }
        }
    }
    cout << sum;
    return 0;
}

这与反向迭代无关,而前迭代将是相同的。地图具有一对键和值。每个键只能包含在地图中一次。当您再次插入相同的键时,上一个值将被覆盖。在第二个测试用例中,您将键0设置三遍:

4 1
0 2 <--
0 3 <--
3 5
0 6 <--

因此您的地图实际上只有三个值,因此三个" HI"是正确的。在您的第一个示例中,您覆盖键2仅两次,因此四个" hi"。也许地图不是您要寻找的正确的容器。