Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】vector:容器的别样风采

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

作者头像
用户11456817
发布于 2025-05-21 05:07:24
发布于 2025-05-21 05:07:24
5300
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

vector:

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

其实就是之前学的顺序表

vector实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    //vector<数据类型>对象名(...)
	vector<int>v1;
	vector<int>v2(10,1);//用10个1来初始化v2
  
    vector<char>
    vector<double>
    vector<string>
	return 0;

}

vector构造函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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] << " ";
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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 << " ";
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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迭代器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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类型的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//与string类中的接口类似
vector<int>arr(10,1);
vector<int>arr1(arr.begin(), arr.end());//迭代器初始化构造
for (auto x:arr1)
{
	cout << x;
}

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

resize():

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++/STL】vector的底层刨析和模拟实现
✨这里将vector的实现都放在一个头文件下,放置多个文件可能会出现链接错误;并设置自己的命名空间,比如我这设置的就是 qian
IsLand1314
2024/10/15
1730
【C++/STL】vector的底层刨析和模拟实现
纵然千万数据流逝,唯独vector长存
第一我们string的char数组结尾存在’\0’ vector vs;是不存在’\0’的概念的 因为我们的vector不仅仅只存char类型,还存储其他的类型的数据
Undoom
2025/05/29
520
纵然千万数据流逝,唯独vector长存
【深入探索 C++ STL 容器 vector】 —— 随机访问与高效存储的完美融合
https://blog.csdn.net/bite_zwy/category_12852141.html
换一颗红豆
2024/12/20
2050
【深入探索 C++ STL 容器 vector】 —— 随机访问与高效存储的完美融合
【C++】Vector的简易模拟与探索
此外范围for其实质上就是通过迭代器来实现的,所以我们写完了迭代器就可以使用范围for来遍历数据了,代码如下:
大耳朵土土垚
2024/05/28
1070
【C++】Vector的简易模拟与探索
C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
我们先定义自己的命名空间俩封装自定义的vector类,这样可以避免与标准库中的 vector 发生命名冲突。随即,我们定义模版类vector,三个成员变量都是迭代器,而vector迭代器又是原生指针,所以我们将指针取别名为iterator
学习起来吧
2024/08/29
2060
C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
初识C++ · 模拟实现vector
继上文模拟实现了string之后,接着就模拟实现vector,因为有了使用string的基础之后,vector的使用就易如反掌了,所以这里直接就模拟实现了,那么实现之前,我们先看一下源代码和文档:
_lazy
2024/10/16
970
初识C++ · 模拟实现vector
【C++】vector(上)
vector类似于数组,采用连续存储空间来存储元素,可以用下标对vector元素进行访问,但它的大小是可以动态改变的,而且这个改变可以被容器自动处理
s-little-monster
2024/08/29
2520
【C++】vector(上)
【C++】vector 常用成员函数的模拟实现
六点半就起.
2024/10/16
780
【C++】vector模拟实现
来看一下vector源码:这里的成员变量都是iterator,而iterator是value_type*,看源码中value_type*又是T。
zxctscl
2024/03/30
1520
【C++】vector模拟实现
【C++】探索STL中的高效容器:vector
C++标准模板库(Standard Template Library,简称STL)是C++的一个库,提供了一组通用的模板类和函数,实现了常用的数据结构和算法。C++中的vector就是是标准模板库(STL)提供的一种容器。
大耳朵土土垚
2024/05/24
1980
【C++】探索STL中的高效容器:vector
如何熟练使用vector?
默认什么元素也没有. 有效元素个数:size=0 容量:capacity=0;
初阶牛
2023/10/14
1950
如何熟练使用vector?
【c++丨STL】vector的使用
之前我们学习了string类的使用及模拟实现,相比c语言的字符串,它的功能更强,安全性更高,操作方式更便捷。然而,在处理更复杂的数据集合时,仅仅依赖字符串往往显得力不从心,尤其是当我们需要管理一系列具有相同类型的数据项时,如一系列的数字、字符或甚至是其他字符串。这时,一个更为强大且灵活的数据结构——向量(vector)便应运而生。
ephemerals__
2024/11/13
3380
【c++丨STL】vector的使用
vector的模拟和实现
如果已经确定vector中要存储元素大概个数,可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了:
南桥
2024/05/13
820
vector的模拟和实现
STL——vector详解
P_M_P
2024/01/18
5710
STL——vector详解
c++STL容器之vector容器
所谓动态扩展:并不是在原空间后接新空间,而是找到更大的内存空间,然后将原数据拷贝至,然后释放原空间。
西西嘛呦
2020/08/26
4590
C++STL容器vector
总结: vector赋值方式比较简单,使用operator=,或者assign都可以
CtrlX
2022/09/28
2680
C++STL容器vector
C++:Vector的使用
2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
小陈在拼命
2024/03/08
1.3K0
C++:Vector的使用
【C++】标准库类型vector
C++ 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。
修修修也
2024/08/06
1640
【C++】标准库类型vector
STL之vector篇(下)(手撕底层代码,从零实现vector的常用指令,深度剖析并优化其核心代码)
在编程的浩瀚星空中,数据结构如同指引方向的星辰,它们不仅是构建算法与程序大厦的基石,更是解决复杂问题、优化性能的关键所在。其中,vector作为C++标准模板库(STL)中的一颗璀璨明珠,凭借其灵活、高效的特点,在软件开发中占据了举足轻重的地位。
suye
2024/10/16
4540
STL之vector篇(下)(手撕底层代码,从零实现vector的常用指令,深度剖析并优化其核心代码)
vector容器!
不同之处在于数组是静态空间,而vector是可以动态扩展的。动态扩展它并不是在原空间之后持续新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间。
用户6280468
2022/03/21
4150
vector容器!
相关推荐
【C++/STL】vector的底层刨析和模拟实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验