地图不是在C++中用作数组样式打印吗?

Doesn't map be used as array-style-printing in C++?

本文关键字:样式 数组 式打印 C++ 地图      更新时间:2023-10-16

只需查看注释中"之间的代码。它输出所有"0",而不输出其他内容。为什么它只产生0,而不是我刚刚插入stl Map的元素?

例如,如果我的输入是"3,45,6,3,1",那么输出应该是"1,2,3,1,5",不是吗?

#include<bits/stdc++.h>
#define lli long long int
using namespace std;
lli k,o[1000010];
int n,tmp=0,i,uq=0,what,ans=1;
map<lli,int> tp;
int main() {
    cin>>n>>k;
//<tagz
    for (i=1;i<=n;i++) {
        cin>>o[i];
        if (tp[o[i]]==0) uq++;
        tp.insert(make_pair(o[i],i));
        cout<<tp[o[i]]<<",";
        tmp=max(tmp,tp[o[i]]);
    }
//   /tagz>
    //cout<<"ZZZ:tmp="<<tmp<<" ,uq="<<uq<<endl;
    cout<<"ZZZ:"<<tp[2]<<endl;
    if (uq<k) {
        cout<<"0";
        return 0;
    }
    i=tmp;int fck=0;
    for (;i<n;i++) {
        fck++;if (fck==200) break;
    //  cout<<"AT "<<i<<endl;
        uq=1;tmp=0;
        map<lli,int> yo;
        for (int j=i+1;j<n;j++) {
            if (o[j]!=o[i]) {
                if (yo[o[j]]==0) uq++;
                yo.insert(make_pair(o[j],j));
                tmp=max(tmp,yo[o[j]]);
            }
        }
        if (uq<k) {
            cout<<ans;
            return 0;
        }
    //  cout<<"  Uq="<<uq<<", tmp="<<tmp<<endl;
        ans++;
        i=tmp;
    }
    cout<<ans;
}

使用[]访问映射时,它首先检查映射中是否存在该键。如果没有,它将创建一个具有默认值(在本例中为0)的新成员。

当您使用insert函数时,它只会在键还没有值的情况下插入值。

如需更多参考,您可以阅读以下答案:https://stackoverflow.com/a/4286924/1466095

在这种情况下,发生的是:

if (tp[o[i]]==0) uq++;:此行为值为0的键创建一个新元素。tp.insert(make_pair(o[i],i));:下一行什么都不做,因为映射中已经存在一个键为o[i]的成员。因此,您的输出全部为0。

要解决此问题,您需要将行插入行替换为:

tp[o[i]] = i;