主要记录在C++学习过程中了解使用过的常用函数–Vector相关操作&取整操作,以便日后回顾复习。
Vector的相关操作
1、erase()删除操作
erase ()函数可以用于删除vector容器中的一个 或者一段元素 :
在删除一个元素的时候,其参数为指向相应元素的迭代器:
v.earse(v.begin()+5); //删除第6个元素
;
而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器:
v.earse(v.begin(), v.begin()+5); //删除前5个元素
;
在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位 ,也就是该迭代器实际上是指向了原来被删除元素的下一个元素 ;删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。
2、fill()置0操作
fill(v.begin(), v.end(), 0); //将vector<int>中的元素置为0
;
3、find()查找操作
find() 函数主要实现的是在容器内查找指定的元素,并且这个元素必须是基本数据类型。查找成功时返回一个指向指定元素的迭代器,查找失败时返回end迭代器。
vector<int>::iterator iter= find(v.begin(), v.end(), key); //返回的是一个迭代器指针
;
find_if() 函数是带条件的查找元素,容器元素是class类的时候,不能使用find()函数,只能通过find_if()函数来实现。find_if()函数依次遍历容器的元素,返回第一个使函数为true的迭代器,如果查找失败则返回end迭代器。
4、swap()交换操作
swap() 操作实现交换两个容器内所有元素的功能。
要交换的容器的类型必须匹配: 必须是相同类型的容器,而且所存储的元素类型也必须相同。调用了swap函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然。
V1.swap(V2); //交换容器V1和V2中的元素
5、vector释放内存
size() :表示实际容器中保存元素的个数;vector通过调用 resize(size_type)
可以在容器尾部添加/删除一些元素来改变容器的size值;
capacity() :表示在重新分配之前允许存放元素的个数;vector通过调用reserve(size_type)
可以设置capacity的值:V.reserve(n)
强制容器把它的容量改为至少n,提供的n不小于当前容量。一般强迫进行重新分配,因为容量需要增加。值得注意的是:如果n小于当前容量,vector会忽略它,该调用什么都不会做。
相关文章参考:https://blog.csdn.net/qit1314/article/details/87253397
clear() 可以清空vector中的元素,使vector的size变为0,capacity不发生变化;
shrink_to_fir() 函数用于减少容量以适应元素个数。值得注意的是:该函数请求容器降低其容量和size匹配,但该请求不具有约束力,容器可以自由地去执行其他的优化方案(capacity可以大于size)。该方法由编译器决定是否真正释放多余的内存,该方法仅是提出请求,是否实现仍由编译器决定。
使用clear()和shrink_to_fir()可以达到释放容器中闲置空间,但由于不具有约束力,这个方式并不靠谱。
vector对于容量的操作是只增不减,erase() 操作删除容器中的元素之后,容器的size会发生变化,capacity不会发生变化;vector复制构造 不会复制capacity,因此可以利用复制构造vector<T>new_vector(old_vector)
和swap() 来释放vector容器闲置的内存空间。
vector<T> ().swap(V); //清空容器V的元素以及内存,size和capacity都变化了
swap()交换技巧实现内存释放的思想:
vector()使用vector的默认构造函数建立临时vector对象,再在临时对象上调用swap()函数,调用之后容器V占用的空间等于一个默认构造的对象大小,临时对象就具有原来容器对象V的大小,而该临时对象随即会被析构,进而释放空间。