当前位置: 首页 > news >正文

Vector

一、基础用法

1. 头文件与命名空间

#include <vector>       // 必须包含的头文件
using namespace std;    // 可选,避免重复写 std::

2. 定义与初始化

// ① 空 vector
vector<int> v1;                  // 存储 int 的空 vector
// ② 指定大小(元素默认初始化,int 为 0,自定义类型调用默认构造)
vector<int> v2(5);               // 大小为 5 的 vector,元素均为 0
vector<string> v3(3);            // 3 个空字符串
// ③ 指定大小 + 初始值
vector<int> v4(4, 10);           // 4 个元素,均为 10 → [10,10,10,10]
// ④ 用初始化列表(C++11+)
vector<int> v5 = {1, 2, 3, 4};   // 直接初始化元素 → [1,2,3,4]
vector<int> v6{5,6,7};           // 同上(省略 =)
// ⑤ 复制初始化(拷贝另一个 vector)
vector<int> v7(v5);              // 复制 v5 的元素 → [1,2,3,4]
vector<int> v8 = v6;             // 同上
// ⑥ 范围初始化(拷贝迭代器范围内的元素)
vector<int> v9(v5.begin(), v5.end());  // 拷贝 v5 全部元素
vector<int> v10(v5.begin()+1, v5.end()-1);  // 拷贝 [2,3]

二、元素访问

vector 支持随机访问(时间复杂度 O (1)),常用访问方式:

1. 下标访问([])

vector<int> v = {10, 20, 30};
cout << v[0];  // 10(不检查越界,越界会导致未定义行为)
v[1] = 200;    // 修改元素 → [10,200,30]

2. at() 方法(带越界检查)

cout << v.at(2);  // 30(越界时抛出 out_of_range 异常,更安全)
v.at(0) = 100;    // 修改元素 → [100,200,30]

3. 访问首尾元素

cout << v.front();  // 第一个元素(100)
cout << v.back();   // 最后一个元素(30)

4. 数据指针(data())

返回指向底层数组的指针,可用于兼容 C 风格函数:

int* p = v.data();  // p 指向 v 的第一个元素
cout << p[1];       // 200(等价于 v[1])

三、添加元素

vector 动态扩容,常用添加元素的方法:

1. 尾部添加(push_back())

在 vector 末尾插入元素(平均时间复杂度 O (1)):

vector<int> v;
v.push_back(1);    // [1]
v.push_back(2);    // [1,2]
v.push_back(3);    // [1,2,3]

2. 插入元素(insert())

在指定位置插入元素(时间复杂度 O (n),需移动后续元素):

vector<int> v = {1, 2, 3};
// ① 在迭代器位置插入单个元素
v.insert(v.begin() + 1, 10);  // 在索引 1 处插入 10 → [1,10,2,3]
// ② 插入多个相同元素
v.insert(v.end(), 2, 0);      // 在末尾插入 2 个 0 → [1,10,2,3,0,0]
// ③ 插入另一个容器的范围
vector<int> temp = {4,5};
v.insert(v.begin(), temp.begin(), temp.end());  // 在开头插入 4,5 → [4,5,1,10,2,3,0,0]

3. emplace 系列(C++11+,更高效)

emplace_back() 和 emplace() 直接在容器中构造元素(避免拷贝,比 push_back/insert 更高效):

vector<pair<int, string>> vp;
// emplace_back 直接构造 pair(参数传递给构造函数)
vp.emplace_back(1, "one");  // 等价于 vp.push_back(pair<int,string>(1, "one"))

四、删除元素

1. 尾部删除(pop_back())

删除最后一个元素(时间复杂度 O (1)):

vector<int> v = {1,2,3};
v.pop_back();  // 删除 3 → [1,2]

2. 指定位置删除(erase())

删除迭代器指向的元素,或范围元素(时间复杂度 O (n)):

vector<int> v = {1,2,3,4,5};
// ① 删除单个元素(迭代器位置)
v.erase(v.begin() + 2);  // 删除索引 2 的元素(3)→ [1,2,4,5]
// ② 删除范围元素([begin, end))
v.erase(v.begin(), v.begin() + 2);  // 删除前 2 个元素 → [4,5]

3. 清空所有元素(clear())

删除所有元素(大小变为 0,但容量可能保留):

v.clear();  // 元素清空,size() 为 0,capacity() 不变

五、容量与大小管理

vector 有两个关键属性:
size():当前元素个数。
capacity():当前可容纳的最大元素个数(底层数组大小)。

1. 查看大小与容量

vector<int> v = {1,2,3};
cout << v.size();      // 3(元素个数)
cout << v.capacity();  // 至少为 3(取决于实现,可能更大)

2. 调整大小(resize())

改变元素个数(若增大,新增元素默认初始化或指定值):

v.resize(5);       // 大小变为 5,新增元素为 0 → [1,2,3,0,0]
v.resize(2);       // 大小变为 2,删除后面的元素 → [1,2]
v.resize(4, 10);   // 大小变为 4,新增元素为 10 → [1,2,10,10]

3. 预留容量(reserve())

提前分配底层内存(避免频繁扩容,提升性能):

vector<int> v;
v.reserve(100);  // 容量至少为 100(size() 仍为 0)
// 后续添加 100 个元素时,不会触发扩容

4. 收缩容量(shrink_to_fit(),C++11+)

将容量缩减至与大小一致(释放多余内存):

vector<int> v(100);
v.resize(10);
v.shrink_to_fit();  // capacity() 变为 10

六、遍历 vector

1. 下标遍历

for (int i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}

2. 迭代器遍历

// 正向迭代器
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
// 反向迭代器(从后往前)
for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit) {cout << *rit << " ";
}

3. 范围 for 循环(C++11+,推荐)

for (int num : v) {  // 只读遍历cout << num << " ";
}
for (int& num : v) {  // 引用遍历(可修改元素)num *= 2;
}

七、其他常用操作

1. 交换两个 vector(swap())

交换两个 vector 的元素(时间复杂度 O (1),仅交换底层指针):

vector<int> v1 = {1,2};
vector<int> v2 = {3,4,5};
v1.swap(v2);  // v1 变为 {3,4,5},v2 变为 {1,2}

2. 检查是否为空(empty())

if (v.empty()) {cout << "vector is empty";
}

3. 排序(配合

#include <algorithm>
vector<int> v = {3,1,4};
sort(v.begin(), v.end());  // 升序 → [1,3,4]
sort(v.rbegin(), v.rend());  // 降序 → [4,3,1]
http://www.sczhlp.com/news/145007/

相关文章:

  • 网站开发和推广方案点击网站出现微信二维码的链接怎么做
  • logo灵感网站网站备案期间 搜索引擎
  • 哪里可以接网站开发的活网业制作软件
  • 怎样找家做网站的公司如何进行网站管理
  • 微设计公司网站一键logo设计官网
  • 在线学习网站模板wordpress好看的评论
  • 四川中天建设有限公司网站益阳市赫山区建设局网站
  • SSM
  • Mybatis Plus
  • 郑州做网站最好的公司跨境电商具体是做什么的
  • 博客网站程序网站开发逻辑图
  • 没有货源可以开网店吗北京网站优化指导
  • 和淘宝同时做电商的网站如何实现
  • 关于单位建设网站的申请手机网站建设推广方案ppt
  • 以下哪个不是网站开发工具移动端网站开发公司
  • wordpress素材下载站四川省建设建设监理协会网站
  • 给漫画网站做推广本地做的网站怎么解析到域名
  • 手游网站做cpc还是cpm广告号网站的超链接怎么做
  • 宁波建设局网站郑建华wordpress 评论ip拉黑
  • 宜宾seo网站建设设计公司网站的要点
  • 西安做网站选哪家毕设源码网站
  • 新网站怎么做才能让搜狗收录网站集约建设
  • 导航网站头部代码福建省建设局实名制网站
  • 成都高端网站制作公司wordpress做个SNS
  • 网站备案变更域名中山最好的网站建设公司哪家好
  • 如何在企业版社保网站做增员江苏建设科技网
  • C语言 - *进制转*进制 3
  • ThreadLocal详解
  • C语言 - *进制转*进制 2
  • 整页图片广告网站源码网页设计公司的市场评估