【C++修仙录02】筑基篇:vector 使用

嗨~大家好,这里是春栀怡铃声的博客~

"做你害怕的事,然后发现,不过如此~"

目录

创建vector

遍历方法

迭代器

[reserve 扩容](#reserve 扩容)

[resize 对size 进行改变 会加值,会减值](#resize 对size 进行改变 会加值,会减值)

insert

size

capacity

empty

push_back

erase

swap

clear


创建vector

cpp 复制代码
vector<int>v2(10, 2); 
vector<int> v1; 
vector<int>v3(++v2.begin(), --v2.end()); //迭代器创建

遍历方法

范围for由2部分组成,冒号前面是范围内用于迭代的变量,第二变量则表示被迭代的范围

自动读取数据,自动结束

cpp 复制代码
vector<int>v3(10,2);
for (auto e : v3) 
{ 
   cout << e<<" ";

} 
  cout << endl; 

下标访问

cpp 复制代码
//下标访问
for (size_t i = 0; i < v3.size(); i++) 
{ 
   cout << v3[i]<<" "; 
}
  cout << endl; 

迭代器

vector 的迭代器可以理解成"指向元素的通用指针",用来遍历和操作容器里的元素。

常用接口

vector<int> v (10,2);

auto it = v.begin(); // 指向第一个元素

auto ed = v.end(); // 指向最后一个元素的后一个位置

遍历

for (auto it = v.begin(); it != v.end(); ++it) {

cout << *it << ' ';

}

常见特性

  • *it 取值

  • ++it 前进

  • it + n、it - n:因为 vector 的迭代器是随机访问迭代器

  • it1 < it2:可比较位置先后

  • it[n]:等价于 *(it + n)

只读迭代器

vector<int>::const_iterator cit = v.cbegin();

const_iterator 不能修改元素。

反向迭代器

cpp 复制代码
  for (auto it = v.rbegin(); it != v.rend(); ++it) 
{
      std::cout << *it << ' ';
}

迭代器遍历

cpp 复制代码
//迭代器遍历
vector<int>::iterator it = v3.begin(); //auto it=v3.begin(); 
while (it != v3.end()) 
{ 
    cout << *it<<" "; 
    ++it; 
} 
  cout << endl;

reserve 扩容

提前开好空间

像下面的示例:创建了string 类 的tmp ,想让tmp 拥有和s1一样大的空间存放数据

使用reserve 开出空间

cpp 复制代码
a. reserve(n) && n<capacity

在vector 中明确不会缩容;

在string (gcc) 会缩容,string(vs.2022) 不会缩容

cpp 复制代码
vector<int>v(10, 2); 
v.reserve(5);
cout << v.size() << endl; 
cout << v.capacity() << endl; 


v.reserve(20); 
cout << v.size() << endl; 
cout << v.capacity() << endl;

初始有效数据有10个,空间大小也为10

第一次reserve(5) 5<10 ,无需扩容,并且不会缩小空间大小 空间大小和有效数据都不变

第二次reserve(20) 需要扩容,空间大小变为20,有效数据不变

resize 对size 进行改变 会加值,会减值

cpp 复制代码
vector<int>v(10, 2); 
v.resize(5);
cout << v.size() << endl;
cout << v.capacity() << endl; 

v.resize(15,6); 
cout << v.size() << endl; 
cout << v.capacity() << endl; 

v.resize(20, 3); 
cout << v.size() << endl; 
cout << v.capacity() << endl;

初始位置有效数据有10个,空间大小为10

经过第一次resize(5) 有效数据缩减到5,空间大小不变

第二次resize(15,6) 有效数据加到15,空间也扩大到15,新增的有效数据都是6

第三次 resize(20,3) 有效数据加到20,空间扩容到22, 新增的有效数据都是3

insert

insert 只能传迭代器

第一个参数代表指向位置插入,第二个参数代表插入的值

cpp 复制代码
void text_vector5() 
{ 
   vector<int>v(10, 2); 
   v.insert(v.begin(), 4); 
   v.insert(v.begin() + 3, 6); //可以通过迭代器加来进行随机位置插入 

for (auto e : v) 
{ 
   cout << e << " "; 
} 
  cout << endl; 
}

size

返回的是v1的有效数据个数

使用

v1.size();

capacity

返回的是v1的空间大小

v1.capacity();

empty

返回v1是否为空的判断值,是空返回true ,不是空返回false

push_back

使用push_back 在v1末尾插入

cpp 复制代码
vector<int>v1;    

v1.push_back(5);

erase

erase 只能传迭代器

一种用法是直接删除传入迭代器指向的位置的值

另一种是删除第一个迭代器到第二个迭代器的范围中的值

cpp 复制代码
vector<int>v1(10,2);
v1.erase(v1.begin());

for (auto e : v1) 
{ 
   cout << e<<" ";

} 
  cout << endl; 
    
v1.erase(--v1.end());
for (auto e : v1) 
{ 
   cout << e<<" ";

} 
  cout << endl; 
   

swap

• vector 的 swap 用来交换两个 vector 的内容,时间复杂度通常是 O(1)。

用法

cpp 复制代码
 #include <iostream>
 #include <vector>
 using namespace std;

  int main() 
{
      vector<int> a = {1, 2, 3};
      vector<int> b = {4, 5};

      a.swap(b);

      for (int x : a) cout << x << " ";  // 4 5
      cout << endl;

      for (int x : b) cout << x << " ";  // 1 2 3
      cout << endl;
  }

交换后:

  • a 变成原来 b 的内容

  • b 变成原来 a 的内容

包括:

  • 元素内容

  • size()

  • capacity()

clear

只删除v1中的数据,v1的空间大小不变

相关推荐
此生决int9 小时前
算法从入门到精通——位运算
数据结构·c++·算法·蓝桥杯
彦为君9 小时前
JavaSE-11-ByteBuffer(NIO核心组件)
java·开发语言·前端·数据库·后端·spring·nio
茉莉玫瑰花茶9 小时前
LangGraph 持久化(Persistence)[ 2 ]
开发语言·python·ai·langgraph
Dxy123931021610 小时前
`...` 展开运算符(Spread Operator)详解
开发语言·javascript
Loli_Wolf10 小时前
AI 原生研发闭环:从提需到线上监测,再自动回到提需
人工智能·深度学习·算法·microsoft·ai·ai编程·harness
丁劲犇10 小时前
使用TraeAI开发Web页面测试MSYS2 ucrt64 Qt MCP服务器
服务器·前端·c++·qt·mcp
有味道的男人10 小时前
AI 对接 1688 图搜接口|Open Claw 以图搜货实战
开发语言·python
计算机安禾10 小时前
【算法分析与设计】第4篇:分治策略的理论框架与经典案例
数据结构·算法·排序算法
Kiling_070410 小时前
面向对象和集合编程题 ( 二 )
java·开发语言·数据结构·算法