std::vector中swap()函数使用解析以及去重复操作

更新时间:2023-07-06 17:35:32 阅读: 评论:0

std::vector中swap()函数使⽤解析以及去重复操作
1、常⽤⽅式,交换vector内部的两个元素
int main(int argc, char* argv[])
{
std::vector<string> ntence;
ntence.push_back("hello");
ntence.push_back("how");
ntence.push_back("are");
ntence.push_back("you");
ntence.push_back("csdn");
beefyswap(ntence[0] ,ntence[4] );
return 0;
}
2、利⽤swap()函数进⾏内存的释放
1)简单介绍
 在vector的数据结构中:
  .clear();清空数据
  .size();当前vector容器内存储的元素的个数
  .capacity();当前vector容器重新分配内存之前所能容纳的元素数量
黑暗物质黄金罗盘
  .swap();函数交换
  .rerve();向系统预订⼀段⾜够的连续的空间
2) 释放内存
中秋节快乐 英语
  ⾸先,vector与deque不同,其内存占⽤空间只会增长,不会减⼩。⽐如你⾸先分配了10,000个字节,然后era掉后⾯9,999个,则虽然有效元素只有⼀个,但是内存占⽤仍为10,000个。所有空间在vector析构时回收。
left out  在⽤vector时,输⼊完⼀组数据处理完后,调⽤clear()进⾏清理,如果此时打印vector[0],会发现仍然输出之前vector所存的内容,但是如果调⽤.empty()函数⼜会返回1,告诉我们这个容器现在是空的,什么原因? 这是因为使⽤.clear()清空内容,但是没有释放内存的原因。举例如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int >a;
cout<&pty()<<endl;//输出  1  代表该vector此时是空
a.push_back(1);
a.push_back(2);
cout<<a[0]<<" "<<a[1]<<endl;//输出1 2
cout<&pty()<<endl;//输出 0 代表该vector此时⾮空
cout<<a.size()<<endl;//输出2
cout<<a.capacity()<<endl;//输出2
cout<<"***************"<<endl;
//a[0]=NULL;a[1]=NULL; 这是赋值为0,并不清空数据,也不释放内存。
monika martin
a.clear();
cout<<a[0]<<" "<<a[1]<<endl;//仍然输出1 2,因为没有释放内存,所以输出该地址的内容仍然与之前⼀样
cout<&pty()<<endl;//输出1  代表该vector此时已经为空
cout<<a.size()<<endl;//输出0,代表当前容器内存储元素个数是0,与.empty()类似,都告诉我们当前容器是空的意思
cout<<a.capacity()<<endl;//输出2,代表当前该vector在重新分配存储空间前所能容纳的元素数量并没有改变
cout<<"***************"<<endl;
/*
下⾯这五⾏说明,.pop_back()与.clear()起到了相同的作⽤,都是清空数据,但是没有释放内存
while(!a.empty()){
a.pop_back();
}
distinguish
cout<&pty()<<endl;//输出 1 代表该vector此时已经为空
cout<<a[0]<<" "<<a[1]<<endl;//仍然输出为 1 2,因为没有释放内存,所以输出该地址的内容仍然与之
前⼀样
*/
a.push_back(4);
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//输出 4 2 0  尽管没有释放内存,但是已经认为该vector已经被清空,所以再push_back();时,a[0]被覆盖。
cout<<a.size()<<endl;//输出1,代表当前容器内存储元素个数是1,就是刚刚push_back();装进去的数起到的作⽤
cout<<a.capacity()<<endl;//此时仍然输出2
cout<<"***************"<<endl;remain是什么意思
  在《effective STL》和其实很多C++⽂章中都有指明,⽤clear()⽆法保证内存回收。但是swap技法可以。 那么如何释放内存呢?我们⽤swap交换到⼀个新的类型的vector,将原来的a拷贝出去,然后⾃然销毁,⽽新的到的a是全新的没有存任何数据的。
具体⽅法如下所⽰:
vector<int>().swap(a);
//或者如下所⽰加⼀对⼤括号都可以,意思⼀样的:
{
std::vector<int> tmp;
ivec.swap(tmp);
}
//加⼀对⼤括号是可以让tmp退出{}的时候⾃动析构
cout<<a.size()<<endl;//输出 0
cout<<a.capacity()<<endl;.// 输出 0
va读音
//cout<<a[1]<<endl;
proud3) 修整空间
  在⼀个应⽤中,可能会需要向⼀个vector中插⼊很多记录,⽐如说100000条,为了避免在插⼊过程中移动内存,咱实现向系统预订⼀段⾜够的连续的空间,例如
vector<int> ivec;
  这个问题是解决了。但是如果后来这个vector不再需要存那么多的元素了,已经通过era删除了。但是以前咱们预留的空间却⽆法被其他程序再度利⽤,这样会造成内存⼀定程度上的浪费。于是,我们利⽤⽬前的vector构造⼀个⼀模⼀样的vector,他并没有预留空间,于是以前预留的空间也被释放以作他⽤了:
ivec.swap(vector<int>(ivec));
// or vector<int>(ivec).swap(ivec)
或者如下所⽰ 加⼀对⼤括号都可以,意思⼀样的:
{
std::vector<int> tmp = ivec;
ivec.swap(tmp);
}
  加⼀对⼤括号是可以让tmp退出{}的时候⾃动析构;使⽤这种⽅法的前提是vector从前存储了⼤量数据,⽐如10000000,经过各种处理后,现在只有100条,那么向清空原来数据所占有的空间,就可以通过这种交换技术swap技法就是通过交换函数swap(),使得vector离开其⾃⾝的作⽤域,从⽽强制释放vector所占的内存空间。
对于容器的去重复操作类似:
std::vector<int> ModuleArr;
//排序
std::sort(ModuleArr.begin(), d());
//去重
圣诞节用英语怎么写

本文发布于:2023-07-06 17:35:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/169096.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   释放   没有   容器   输出
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图