set && map
1.set不支持元素直接修改
#include<bits/stdc++.h>
using namespace std;
set<int>s;
int main(){
s.insert(1);
s.insert(2);
s.insert(3);
for(auto &i:s)
i++;
}
编译一下,出现如下报错:
[Error] increment of read-only reference 'i'
因为set中元素是只可读的,所以会编译错误,应该这么写:
#include<bits/stdc++.h>
using namespace std;
set<int>s;
int main(){
s.insert(1);
s.insert(2);
s.insert(3);
for(auto &i:s)
s.erase(i),s.insert(i+1);
}
此外,multiset、unordered_set、unordered_multiset都不可以直接修改。
注:代码仅用于参考,不一定能正常运行。
2.multi-容器查找时间复杂度
实验代码:
#include<bits/stdc++.h>
using namespace std;
multimap<int,int>m;
int main(){
for(int i=1;i<=100;i++){
m.clear();
for(int j=1;j<=100000;j++)
m.insert({1,1});
int x=m.count(1);
}
printf("%ld",clock());
}
#include<bits/stdc++.h>
using namespace std;
map<int,int>m;
int main(){
for(int i=1;i<=100;i++){
m.clear();
for(int j=1;j<=100000;j++)
m.insert({1,1});
int x=m.count(1);
}
printf("%ld",clock());
}
#include<bits/stdc++.h>
using namespace std;
multiset<int>s;
int main(){
for(int i=1;i<=100;i++){
s.clear();
for(int j=1;j<=100000;j++)
s.insert(1);
int x=s.count(1);
}
printf("%ld",clock());
}
#include<bits/stdc++.h>
using namespace std;
set<int>s;
int main(){
for(int i=1;i<=100;i++){
s.clear();
for(int j=1;j<=100000;j++)
s.insert(1);
int x=s.count(1);
}
printf("%ld",clock());
}
运行,可以发现:
multiset、multimap查找功能时间复杂度是O(这个数的个数+log(n)),很容易被卡成O(n+logn),所以multiset尽量用map代替哦。