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

相关推荐
1-1=043 分钟前
C# 委托与事件
开发语言·c#
Fuyo_11191 小时前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
Julien20043 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
Chen_harmony3 小时前
七、STL与string类
开发语言·c++
沐晓时光3 小时前
C语言入门,字符串和字符串函数知识讲解
c语言·开发语言
xxxiugou1233 小时前
C++命名空间与引用全解析
开发语言·c++
风影同志783243 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG4 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
用户7624117567054 小时前
第十五章 人工智能基础
c++