【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的空间大小不变

相关推荐
星栈独行8 小时前
翻完 Pi 源码:它和 Codex、Claude Code 有何不同
开发语言·javascript·人工智能·程序人生
2601_954526758 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_448011169 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
code_pgf9 小时前
`unordered_map` 详解
c++
叩码以求索9 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
孫治AllenSun10 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
一拳一个呆瓜11 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流11 小时前
判断素数与拓展应用
c++
众少成多积小致巨11 小时前
C++ 规范参考(下)
c++
c2385611 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法