找回密码
 register

QQ登录

只需一步,快速开始

查看: 8|回复: 0

[C++] std::vector 动态数组容器 <vector>

[复制链接]

[C++] std::vector 动态数组容器 <vector>

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:155
  • 打卡月天数:4
  • 打卡总奖励:154
  • 最近打卡:2025-04-06 09:07:37
Waylee

主题

0

回帖

1万

积分

仙帝

积分
18941
Waylee 2025-4-6 09:28 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

1. 基本用法

#include <vector>
#include <iostream>

int main() {
    // 创建空vector
    std::vector<int> vec1;

    // 创建含5个元素的vector,初始值为0
    std::vector<int> vec2(5);

    // 创建含3个元素的vector,初始值都为10
    std::vector<int> vec3(3, 10);

    // 使用初始化列表
    std::vector<int> vec4 = {1, 2, 3, 4, 5};

    return 0;
}

2. 常用操作

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 添加元素
    vec.push_back(4);  // 末尾添加
    vec.insert(vec.begin() + 1, 5);  // 在指定位置插入

    // 访问元素
    int first = vec[0];  // 不检查边界
    int second = vec.at(1);  // 检查边界,越界抛出异常

    // 删除元素
    vec.pop_back();  // 删除末尾元素
    vec.erase(vec.begin() + 1);  // 删除指定位置元素

    // 获取大小
    int size = vec.size();
    bool isEmpty = vec.empty();

    // 清空vector
    vec.clear();

    return 0;
}

3. 遍历vector

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 方法1: 使用下标
    for(size_t i = 0; i < vec.size(); ++i) {
        std::cout << vec[i] << " ";
    }

    // 方法2: 使用迭代器
    for(auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }

    // 方法3: 范围for循环
    for(int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

4. 二维vector

#include <vector>
#include <iostream>

int main() {
    // 创建3x4的二维vector,初始值为0
    std::vector<std::vector<int>> matrix(3, std::vector<int>(4));

    // 初始化二维vector
    std::vector<std::vector<int>> mat = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 访问元素
    int val = mat[1][2];  // 获取第2行第3列元素

    // 遍历二维vector
    for(const auto& row : mat) {
        for(int num : row) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

5. 常用成员函数

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 获取首尾元素
    int front = vec.front();
    int back = vec.back();

    // 容量相关
    vec.reserve(100);  // 预留空间
    int capacity = vec.capacity();

    // 调整大小
    vec.resize(5);  // 新元素初始化为0
    vec.resize(8, 10);  // 新元素初始化为10

    // 交换两个vector
    std::vector<int> other = {4, 5, 6};
    vec.swap(other);

    return 0;
}

6. assign() 方法

重新赋值:
assign() 方法允许用指定的值或范围来重新填充整个 vector,这在需要重置容器内容时很有用。

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 使用 assign() 重置 vector 的内容为 5 个 10
    vec.assign(5, 10);

    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

7. 获取底层数组指针

data() 成员函数:
vector::data() 返回指向连续存储数组的指针,方便与 C 风格数组互操作或传递给需要指针的 API。

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int* arr = vec.data();

    // 输出底层数组的内容
    for (size_t i = 0; i < vec.size(); ++i) {
        std::cout << arr[i] << " ";
    }

    return 0;
}

8. 反向迭代器

反向遍历:
std::vector 提供了 rbegin() 和 rend() 成员函数,可以从尾部开始遍历容器。

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 反向遍历 vector
    for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
        std::cout << *rit << " ";
    }

    return 0;
}

9. emplace 系列函数

emplace_back() 和 emplace():
从 C++11 开始,std::vector 支持 emplace_back 和 emplace 函数,可以直接在容器尾部或指定位置构造对象,减少不必要的拷贝或移动操作。

#include <vector>
#include <iostream>

struct Person {
    std::string name;
    int age;
    Person(const std::string& n, int a) : name(n), age(a) {}
};

int main() {
    std::vector<Person> people;

    // 使用 emplace_back 直接构造 Person 对象
    people.emplace_back("Alice", 30);
    people.emplace_back("Bob", 25);

    for (const auto& p : people) {
        std::cout << p.name << " (" << p.age << ")" << std::endl;
    }
    return 0;
}

关键特性:

  1. 动态数组,自动管理内存
  2. 随机访问时间复杂度:O(1)
  3. 尾部插入/删除:平均O(1)
  4. 中间插入/删除:O(n)
  5. 需要包含头文件<vector>
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-4-7 13:09 , Processed in 0.118474 second(s), 6 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表