【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:可比较位置先后

  • itn:等价于 *(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的空间大小不变

相关推荐
dengyuezhe80601 分钟前
《C++ 异常机制与智能指针:从原理到实现》
android·java·c++
于指尖飞舞1 分钟前
java后端面试题(常用集合极简)
java·开发语言·面试
YHHLAI6 分钟前
LeetCode 1.两数之和 | 从暴力枚举到线性优化
算法·leetcode·职场和发展
Urbano7 分钟前
工装标准缝纫流程及自动化升级提质增产方案
大数据·人工智能·算法
稷下元歌19 分钟前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
aerror19 分钟前
如何解决brew安装编译不过的问题
c++
AI人工智能+电脑小能手25 分钟前
【大白话说Java面试题 第114题】【并发篇】第14题:说一下悲观锁的优点和缺点?
java·开发语言·面试
盒马盒马27 分钟前
Rust:Vec
开发语言·rust
devilnumber30 分钟前
Java 迭代器(Iterator)完全指南:从入门到实战
java·开发语言·迭代器
罗超驿31 分钟前
13.Java多线程进阶:手动实现线程池与定时器机制详解
开发语言·面试·javaee