标签:std false sync swap tie 搞懂 main fill
1
int a,b,*c,*d;
signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);
a=1,b=2;
c=&a,d=&b;
cout<<a<<" "<<b<<" "<<*c<<" "<<*d<<endl;
swap(a,b);
cout<<a<<" "<<b<<" "<<*c<<" "<<*d<<endl;
return 0;}
结果为
1 2 1 2
2 1 2 1
说明 swap 不是交换指针,而是内存内容的改变。
2
#define N 10000000
int a[N],b[N],*c,*d;
signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);
fill(a,a+N,1);
fill(b,b+N,2);
c=a,d=b;
cout<<a[0]<<" "<<b[0]<<" "<<c[0]<<" "<<d[0]<<endl;
swap(a,b);
cout<<a[0]<<" "<<b[0]<<" "<<c[0]<<" "<<d[0]<<endl;
return 0;}
结果为
1 2 1 2
2 1 2 1
说明数组的 swap 也不是交换指针,而是内存内容的改变。
所以一次 swap 的复杂度是数组长度的,请注意。
3
#define N 10000000
int a[N],b[N],*c,*d;
signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);
fill(a,a+N,1);
fill(b,b+N,2);
c=a,d=b;
cout<<a[0]<<" "<<b[0]<<" "<<c[0]<<" "<<d[0]<<endl;
swap(c,d);
cout<<a[0]<<" "<<b[0]<<" "<<c[0]<<" "<<d[0]<<endl;
return 0;}
结果为
1 2 1 2
1 2 2 1
指针 swap,但是内存没有换,这样是 \(O(1)\) 的。
写滚动数组时最好用这种方式。
4
那有的人就要慌了,swap 的复杂度就这么高吗。
#define N 10000000
vector<int> a,b;
signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);
a.resize(N);
b.resize(N);
fill(a.begin(),a.end(),1);
fill(b.begin(),b.end(),2);
For(i,1,N) swap(a,b);
return 0;}
结果不会 TLE。
vector 是 \(O(1)\) 交换指针。
5
#define N 1000000
set<int> a,b;
signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);
For(i,1,N) a.insert(i);
For(i,1,N) b.insert(-i);
For(i,1,N) swap(a,b);
return 0;}
结果不会 TLE。
其他 STL 也是 \(O(1)\) 交换指针。
标签:std,false,sync,swap,tie,搞懂,main,fill 来源: https://www.cnblogs.com/shaojia/p/16686116.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。