STL 之 vector
【摘要】 🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
vector的基本用法:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//转自:https://www.cnblogs.com/zhonghuasong/p/5975979.html
int main(int argc, char *argv[])
{
/*
* 1.声明向量
*/
/*
vector<int> vec; //声明一个int型向量
vector<int> vec(10); //声明一个初始大小为10的int向量
vector<int> temp(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> vec(temp); //声明并用tmp向量初始化vec向量
vector<int> v(vec.begin(), vec.begin() + 3); //用向量vec的第0个到第2个值初始化v
int arr[5] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr + 5); //将arr数组的元素用于初始化vec向量
vector<int> v(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为v的初始值
*/
/*
* 2. 容量计算
*/
/*
* vec.size() : 向量大小
* vec.capacity() : 向量真实大小
* vec.empty() : 向量判空
* vec.max_size() : 向量最大可以分配的容量
* vec.resize() : 更改向量大小,可以更改为0,小于当前容量,大于当前容量
* vec.shrink_to_fit() : 使vec的分配容量大小(即capacity())与size()相等
*/
/*
* 3. 修改
*/
/*
* vec.push_back() : 末尾添加元素
* vec.pop_back() : 末尾删除元素
* vec.swap() : 交换两个向量的所有元素
* vec.clear() : 清空向量元素
* vec.insert() : 任意位置插入元素,
* 例如: vec.insert(vec.begin()+1,10),在下标1处插入元素10,下标从0开始
* vec.erase() : 任意位置删除元素或删除一段区间的元素
* 例如:vec.erase(vec.begin()+2),删除下标为2的元素,下标从0开始
* vec.erase(vec.begin()+2, vec.begin()+5),删除下标从2到5的位置的元素
* vec.assign() : 多个元素赋值
* 例如:v.assign(vec.begin(), vec.begin()+5),将vec的下标0-4的元素赋给向量v,
* 类似于数组初始化的赋值,v.size()改为5
*/
/*
* 4.迭代器
*/
/*
* vec.begin(): 开始指针
* vec.end() : 末尾指针
* vec.cbegin() : 指向常量的开始指针
* vec.cend() :指向常量的末尾指针
*/
/*
* 5.元素的访问
*/
/*
* vec[i] : 下标访问
* vec.at(i) : 以上两者的区别就是at会检查是否越界,是则抛出out of range异常
* vec.front() : 返回向量vec的第一个元素下标为0
* vec.back() : 返回向量vec的最后一个元素下标为size()-1
*
*/
/*
* 6.遍历元素
*/
vector<int>vec(10, 2);
vector<int>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
cout<<*it<<endl;
//当然也可以用下标访问
/*
* 元素翻转
*/
vec.push_back(5);
reverse(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); ++i)
cout<<vec[i]<<" ";
cout<<endl;
/*
* 元素排序
*/
vec.push_back(1);
vec.push_back(3);
sort(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); ++i){
cout<<vec.at(i)<<" ";
}
cout<<endl;
return 0;
}
vector 的扩容机制
为了支持快速随机访问,vector将元素连续存储—每一个元素紧挨着前一个元素存储。
vector的扩容机制涉及到的几个函数如下所示:
size( ) : 容器已经保存的元素的个数;
capacity( ) : 容器在不分配新的内存空间的前提下它最多可以保存多少元素;
shrink_to_fit( ):将capacity( )减少为与size( )相同大小;
reserve( n ): 分配至少能容纳n个元素的内存空间;
capacity() 的大小总是大于等于size()的大小,当capacity() = size()时,如果再添加一个元素,capacity()就会变为原来capacity()大小的两倍(这要看具体的标准库,这里以两倍进行讲解),这时候,容器将已有元素从旧位置移动到新空间,然后添加新元素,释放旧的存储空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了,测试代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
cout<<"size() = "<<vec.size()<<" capacity() = "<<vec.capacity()<<endl;
for(int i = 0;i < 10 ; ++i){
vec.push_back(i);
cout<<"size() = "<<vec.size()<<" capacity() = "<<vec.capacity()<<endl;
}
return 0;
}
输出结果:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)