地图不是在C++中用作数组样式打印吗?
Doesn't map be used as array-style-printing in C++?
只需查看注释中"之间的代码。它输出所有"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;
相关文章:
- 将包含C样式数组的对象初始化为成员变量(C++)
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 如何在谷歌模拟中匹配 C 样式数组
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 解压缩 C 样式数组以及C++中的参数包
- 复制 C 样式数组和结构
- C++中循环和 C 样式数组的范围工作
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- std::array与C样式数组用于连续内存
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 不要声明 C 样式数组,而是使用 std::array<>
- 带C++的 C 样式数组?
- 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
- 将 unique_ptr<std::vector> 与 c 样式数组结合使用
- 为什么我不能将 C 样式数组复制到 std::array?
- 函数需要 C 样式数组
- 键入 trait 以获取 std::array 或 C 样式数组的元素类型
- 何时需要删除 C 样式数组
- C++ C 样式数组作为语法错误的参数