当前位置: 首页 > news >正文

【C++】vector:容器的别样风采

目录

vector:

vector实例化:

vector构造函数:

vector对象尾插:v1.push_back()

vector迭代器:

vector实例化string类型的对象

vector接口:

begin()+end()//rbegin()+rend()

resize():


vector:

vector是序列容器,表示大小可以变化的数组

其实就是之前学的顺序表

vector实例化:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{//vector<数据类型>对象名(...)vector<int>v1;vector<int>v2(10,1);//用10个1来初始化v2vector<char>vector<double>vector<string>return 0;}

vector构造函数:

//n个val构造
vector<int>arr(10, 1);
for (auto x:arr)
{cout << x << " ";
}
//拷贝构造
vector<int>arr(10, 1);
vector<int>arr1(arr);
for (auto x : arr)
{cout << x << " ";
}//在c++11规则下,vector还支持类型数组一样的初始化
vector<int>v1={1,2,3,4,5};//这里存在隐式类型转换
//initializer list (6)	
vector (initializer_list<value_type> il,//c++11下,新增的构造函数const allocator_type& alloc = allocator_type());
//它支持用一个花括号来初始化一个对象,这个对象的类型就是'initializer_list'
auto i1={1,2,3,4};//i1的类型是initializer_list,initializer_list可以理解为是一个容器,它支持用一个{}来初始化这个容器,这个容器只支持遍历,不支持插入数据与删除数据
//或者记忆为:vector不能实现参数多变,只能使用initializer_list对象****************************************************************************
vector<int>v1={1,2,3,4,5};//这个存在一个隐式类型转换,原本是构造+拷贝构造,只不过被编译器优化,变成了直接构造
vector<int>v2({1,2,3,4,5});//这里直接将参数传给initializer_list构造函数

vector对象尾插:v1.push_back()

  vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);for (int i=0;i<v1.size();i++){cout << v1[i] << " ";}
//assign
vector<int>v1 = {1,2,3,4,5};
v1.assign({10,20,30});//为v1分配一个新空间, 并把10,20,30赋值给v1,并修改v1的size
for (auto x : i1)
{cout << x << " ";
}
cout << endl;//insert
//1:
v1.insert(v1.begin(),10);//在当前位置插入一个值,不能输坐标,只能用迭代器
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//2:
v1.insert(v1.begin(), 10,0);//在当前位置,插入10个0
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//3:
v1.insert(v1.begin(), v2.begin(), v2.end());//在当前位置,插入这一迭代器区间的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//erase
v1.erase(v1.begin());//删除迭代器位置的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;v1.erase(v1.begin(),v1.end());//删除某一迭代器区间的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//shrink_to_fit
vector<int>v1(10);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.resize(5);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.shrink_to_fit();//将空间缩容到与当前数据个数相同的大小
cout << v1.size() << endl;
cout << v1.capacity() << endl//data
vector<int>v1 = { 1,2,3,4,5,6,7 };
int* p = v1.data();//返回指向这一数组的指针for (int i=0;i<v1.size();i++)
{cout << (*p) << endl;p++;
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
auto it = v1.begin();
v1.emplace(it,10);//在当前迭代器的位置插入数据
for (auto e : v1)
{cout << e << " ";
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
v1.emplace_back(100);//在容器末尾插入数据
for (auto e : v1)
{cout << e << " ";
}
vector<int>v1 = {1,2,3,4,5,6,7};
v1[9]++;//[]越界直接断言报错vector<int>v1 = {1,2,3,4,5,6,7};
cout << v1.at(9) << endl;//抛异常

vector迭代器:

  vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);vector<int>::iterator it1 = v1.begin();//it1为迭代器名while (it1!=v1.end()){cout << *it1 << " ";++it1;}
*************************************
//迭代器失效
void insert(iterator pos, const T& x)
{assert(pos>=_start&&pos<=_finish);if (_finish==_endofstorage){size_t len = pos - _start;//迭代器失效->因为一些原因,迭代器不可用reserve(capacity()==0?4:capacity()*2);pos = _start + len;//虽然更新了pos,但是对形参的修改不会影响实参}iterator i = _finish - 1;while (i>=pos){*(i + 1) = *i;--i;}*pos = x;++_finish;
}if (it!=v1.end())
{it = v1.insert(it, 10 * x);cout << *it << endl;//迭代器失效
}
//it做为实参,将值传给形参pos,当不需扩容时,不会存在迭代器失效的问题
//若需要扩容,虽然我们对pos进行了更新,但是对作为形参的pos进行修改不会影响到实参it//迭代器失效的两种原因://1.扩容引起的野指针失效//2.删除数据,迭代器已经不是指向之前的位置了,这就导致可能会造成逻辑错误

vector实例化string类型的对象

vector<string>vstr;
string s1 = "张三";
vstr.push_back(s1);
vstr.push_back("李四");//单参数构造函数支持隐式类型转换vector<string>vstr;
string s1 = "张三";vstr.push_back(s1);
vstr.push_back("李四");for (const auto& e:vstr)//auto&是为了减少拷贝,const是为了防止数据被修改
{//e[0]++;cout << e << " ";
}vstr[0] += 'x';//vstr[0]表示访问第一个string类型的值,就是张三,+='x'就表示在张三后面加上一个'x'vstr[0] +="hello";//为什么支持+=?因为实例化的是string类型,这里调用的实际上是string类型的+=vstr[0][1]++;vstr[0][1]++;vstr[0][1]++;vstr[1][1]++;vstr[1][1]++;vstr[1][1]++;for (const auto& x:vstr){cout << x;}

vector接口:

begin()+end()//rbegin()+rend()

//与string类中的接口类似
vector<int>arr(10,1);
vector<int>arr1(arr.begin(), arr.end());//迭代器初始化构造
for (auto x:arr1)
{cout << x;
}

都与string类中的接口用法一样。

resize():

改变的是对象中有效字符的个数,当改变的值大于当前空间值时,会增容。

相关文章:

  • window 显示驱动开发-准备 DMA 缓冲区
  • 日志根因分析:Elastic Observability 的异常检测与日志分类功能
  • 企业终端设备的安全管控
  • 基于Spring Boot与jQuery的用户管理系统开发实践✨
  • 自动化测试核心知识梳理与 Java 代码详解
  • Python列表推导式和生成器表达式详解
  • 【鸿蒙开发】安全
  • CentOS 7连接公司网络配置指南
  • c++学习方向选择说明
  • 普通人如何开发并训练自己的脑力?
  • 【移动应用安全】Android系统安全与保护机制
  • python学习day2
  • BeanFactory和FactoryBean的区别
  • 怎么样进行定性分析
  • SeleniumBase - 多合一浏览器自动化框架
  • 初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
  • leetcode hot100:一、解题思路大全:技巧(只出现一次的数字、多数元素、颜色分类、下一个排列、寻找重复数)、矩阵(矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵Ⅱ)
  • Python 训练营打卡 Day 29
  • 实战项目8(实训)
  • 迅联文库开发日志(三)登陆注册
  • 6月底将返回中国,旅日大熊猫获颁“感谢状”
  • 专家:新冠病毒流行高峰无明显季节性特征,与人群抗体水平有关
  • 在越剧之乡嵊州,浙江音乐学院越剧学院成立
  • 俄美元首通话超2小时,普京称愿与乌方共同起草和平备忘录
  • 英国知名歌手批政府:让AI公司免费使用艺术家作品是盗窃
  • 国际博物馆日|航海博物馆:穿梭于海洋神话与明代造船工艺间