C++ Vector 基础入门操作

一、Vector初始化:5种常用方式

​​1. 默认构造​ ​

创建空容器,适用于后续动态添加元素:

cpp 复制代码
std::vector<int> vec;  // 空vector,size=0

2. 指定大小和初值​ ​

预分配空间并初始化元素:

复制代码
cpp 复制代码
std::vector<int> vec(5);       // 5个0(int默认值)
std::vector<float> vec(3, 1.5); // 3个1.5

​​3. 列表初始化(C++11)​ ​

直接赋予初始值:

cpp 复制代码
std::vector<char> vowels = {'a', 'e', 'i', 'o', 'u'};
复制代码

4. 复制其他容器​ ​

通过迭代器范围复制:

复制代码
cpp 复制代码
int arr[] = {1, 3, 5};
std::vector<int> vec(std::begin(arr), std::end(arr)); // 复制数组
std::vector<int> vec2(vec1);                         // 复制整个vector

​​5. 使用assign()赋值​ ​

清空现有元素并重新赋值:

复制代码
cpp 复制代码
vec.assign(4, 100);            // 4个100
vec.assign(oldVec.begin(), oldVec.end()); // 复制另一个容器的内容

二、增删改查:高效操作指南

​​1. 添加元素​​

  • ​尾部插入​ (高效,O(1)均摊):

    复制代码
    cpp 复制代码
    vec.push_back(10);     // 传统方式
    vec.emplace_back(20);  // 直接构造(避免拷贝,效率更高)
  • ​任意位置插入​ (谨慎使用,O(n)):

    复制代码
    cpp 复制代码
    vec.insert(vec.begin() + 2, 30);  // 在索引2处插入30
    vec.insert(vec.end(), {4, 5});    // 尾部插入多个元素

​​2. 删除元素​​

  • ​尾部删除​ (O(1)):

    复制代码
    cpp 复制代码
    vec.pop_back();  // 删除最后一个元素
  • ​任意位置删除​ (O(n)):

    复制代码
    cpp 复制代码
    vec.erase(vec.begin() + 1);          // 删除索引1处元素
    vec.erase(vec.begin(), vec.begin() + 2); // 删除前2个元素
    vec.clear();                         // 清空所有元素(容量不变)

​​3. 修改元素​ ​

随机访问修改(O(1)):

cpp 复制代码
vec[0] = 100;                  // 无边界检查
vec.at(1) = 200;               // 有边界检查(越界抛异常)

​​4. 查询元素​​

复制代码
cpp 复制代码
int first = vec.front();       // 首元素
int last = vec.back();         // 末元素
int third = vec[2];            // 索引2处元素(无检查)
int fourth = vec.at(3);        // 索引3处元素(有检查)

⚠️ ​​性能警告​​:避免在头部/中间频繁插入删除,优先选择尾部操作!


三、判空操作:避免逻辑错误

​​1. 一维Vector判空​ ​

使用empty()代替size()==0(效率更高):

复制代码
cpp 复制代码
if (vec.empty()) {
    std::cout << "Vector is empty!";
}

​​2. 二维Vector判空​ ​

需检查外层和内层容器:

cpp 复制代码
bool isMatrixValid(const vector<vector<int>>& mat) {
    if (mat.empty()) return false;          // 外层空
    for (const auto& row : mat) {
        if (row.empty()) return false;      // 内层存在空行
    }
    return true;
}

四、比较操作:规则与示例

​​比较规则​​:

  • ​== / !=​:元素数量相同且对应位置值相等
  • ​< / <= / > / >=​:按字典序逐元素比较

​​代码示例​​:

cpp 复制代码
std::vector<int> a = {1, 2, 3};
std::vector<int> b = {1, 2, 4};

cout << (a == b ? "Equal" : "Not equal");  // 输出:Not equal
cout << (a < b ? "a < b" : "a >= b");      // 输出:a < b(因 3 < 4)

五、二维数组:动态实现方案

​​1. 初始化固定行列​​

cpp 复制代码
vector<vector<int>> matrix(3, vector<int>(4));      // 3行4列,默认值0
vector<vector<int>> matrix(2, vector<int>(3, -1));   // 2行3列,初始值-1

​​2. 动态添加行/列​​

复制代码
cpp 复制代码
matrix.push_back(vector<int>(5, 0));  // 添加一行5个0
matrix[0].resize(6);                 // 第一行扩展至6列

​​3. 遍历与访问​​

复制代码
cpp 复制代码
for (size_t i = 0; i < matrix.size(); ++i) {
    for (size_t j = 0; j < matrix[i].size(); ++j) {
        cout << matrix[i][j] << " ";
    }
    cout << endl;
}

💡 ​​适用场景​​:需动态调整行列数时优先使用,固定大小数组建议用原生数组。


总结:Vector核心要点

​​维度​​ ​​关键点​​ ​​性能提示​​
初始化 预分配空间避免多次扩容 用reserve()减少内存重分配
增删改查 尾部操作高效,中间操作昂贵 优先用emplace_back替代push_back
判空 多维容器需检查内层空 用empty()而非size()==0
比较 字典序逐元素比较 确保元素类型支持比较操作
二维数组 灵活但内存非完全连续 固定大小时考虑原生数组
相关推荐
小蒋观天下2 分钟前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
echome8886 分钟前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
云和数据.ChenGuang7 分钟前
Python 单继承与多继承深度剖析:从 MRO 到实战取舍
开发语言·人工智能·python·langchain
小咕聊编程1 小时前
基于Python的豆瓣电影数据可视化系统构建分析
开发语言·python·信息可视化
WBluuue1 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
脏脏a2 小时前
延迟与画质:远程控制的生命线
开发语言·php
澳鹏Appen3 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
像风一样的男人@3 小时前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤3 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
必须得开心呀3 小时前
字节序大小端科普
c++·程序人生