C++ vector容器

文章展示了C++标准库中的vector容器的使用,包括初始化、修改、元素访问、大小和容量管理、操作复杂度以及如何利用迭代器和算法进行操作。例如,vector内存是连续的,末尾添加元素具有常数时间复杂度,而在中间插入和删除则是线性时间复杂度。此外,还通过示例代码演示了push_back、shrink_to_fit、resize、erase、swap、sort、transform等函数的应用。
摘要由CSDN通过智能技术生成

vector容器

#include <iostream>
#include <vector>
#include <algorithm>


/*
 vector 容器示例
 vector 是动态数组,可以随意添加元素
 与array一样,vector的内存是连续的,对应的内存空间随着元素的增加而增加
 在内存中是连续的
 获取元素的复杂度是常数,与 vector 的大小无关
 在 vector 末尾增加、删除元素的复杂度是常数,与vector大小无关
 在 vector 中间增加、删除元素的复杂度是线性的,与vector大小有关
 可以使用迭代器和算法
*/

// 使用函数模板
template <typename T>
void display(const std::vector<T> &arr){
    // 打印 array 数组内的元素
    for (const auto &i: arr)
        std::cout << i << " ";

    std::cout << std::endl;
}




void test1()
{
    // 初始化1
    std::vector <int> v1 {1, 2, 3, 4, 5};
    display(v1);

    // 修改
    v1 = {2, 2, 2};
    display(v1);

    // 初始化2
    std::vector <int> v2(10, 88);  // 结果为10个88:88 88 88 88 88 88 88 88 88 88
    display(v2);
}

void test2()
{
    std::vector <int> v1 {1, 2, 3, 4, 5};
    display(v1);
    std::cout << "size: " << v1.size() << std::endl;          // 大小
    std::cout << "capacity: " << v1.capacity() << std::endl;  // 容量    
    std::cout << "max_size: " << v1.max_size() << std::endl;  // 最大容量 始终不变的

    v1.push_back(6);  // 末尾添加元素
    display(v1);
    std::cout << "size: " << v1.size() << std::endl;          // 大小
    std::cout << "capacity: " << v1.capacity() << std::endl;  // 容量    每次超出容量,容量翻倍 
    std::cout << "max_size: " << v1.max_size() << std::endl;  // 最大容量

    v1.shrink_to_fit();  // 释放多余的内存
    std::cout << "size: " << v1.size() << std::endl;          // 大小
    std::cout << "capacity: " << v1.capacity() << std::endl;  // 容量    
    std::cout << "max_size: " << v1.max_size() << std::endl;  // 最大容量

    v1.resize(100); // 预留100个元素的内存空间,若超出,则依然是容量翻倍
    std::cout << "size: " << v1.size() << std::endl;          // 大小
    std::cout << "capacity: " << v1.capacity() << std::endl;  // 容量    
    std::cout << "max_size: " << v1.max_size() << std::endl;  // 最大容量
}

void test3()
{
    std::vector <int> v1 {1, 2, 3, 4, 5};
    display(v1);

    // 修改
    v1[0] = 100;
    v1.at(1) = 200;
    display(v1);


    std::cout << "获取第一个元素: " << v1.front() << std::endl;   
    std::cout << "获取最后一个元素: " << v1.back() << std::endl;  

    v1.pop_back();  // 删除最后一个元素
    display(v1);
}

void test4()
{
    std::vector <int> v1 {1, 2, 3, 4, 5};
    display(v1);

    v1.clear();
    display(v1);

    v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    display(v1);
    v1.erase(v1.begin(), v1.begin() + 3);  // 删除前三个元素
    display(v1);

    v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    display(v1);

    // 删除所有偶数
    std::vector <int>::iterator it = v1.begin();  // 获取迭代器
    while (it != v1.end())  
    {
        if (*it % 2 == 0)
            v1.erase(it);
        else
            it++;
    }
    display(v1);


}

void test5()
{
    std::vector <int> v1 {1, 2, 3, 4, 5};
    std::vector <int> v2 {10, 20, 30, 40, 50};
    // 交换
    v1.swap(v2);

    display(v1);
    display(v2);
}
void test6()
{
    std::vector <int> v1 {2, 1, 4, 5, 3};
    // 排序
    std::sort(v1.begin(), v1.end());
    display(v1);
}
void test7()
{
    std::vector <int> v1 {1, 2, 3, 4, 5};
    std::vector <int> v2 {10, 20, 30, 40, 50};
    // 将 v1 拷贝到 v2 内, 末尾插入的方式
    std::copy(v1.begin(), v1.end(), std::back_inserter(v2));

    // 条件拷贝 当前为偶数 使用了lambda表达式
    v1 = {1, 2, 3};
    v2 = {10, 20};
    std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2), 
    [](int x){ return x % 2 ==0;});
    display(v1);
    display(v2);

}
void test8()
{

    std::vector<int> v1{1, 2, 3, 4, 5};
    std::vector<int> v2{10, 20, 30, 40, 50};
    std::vector<int> v3;

    std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3),
                   [](int x, int y)
                   { return x + y; }); // 加法
    // std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3), std::plus<int>()); // 使用内置的加法函数
    std::cout << "v1 + v2 = " << std::endl;
    display(v3);

    v3.clear(); // 清空容器
    std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3),
                   [](int x, int y)
                   { return x * y; }); // 乘法
    // std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3), std::multiplies<int>()); // 使用内置的乘法函数
    std::cout << "v1 * v2 = " << std::endl;
    display(v3);

}
void test9()
{   
    std::vector<int> v1{1, 2, 3, 4, 5};
    std::vector<int> v2{10, 20, 30, 40, 50};
    
    auto it = std::find(v1.begin(), v1.end(), 5); // 查找5第一次出现的位置

    if (it != v1.end())
    {
        std::cout << "已找到" << std::endl;
        v1.insert(it, v2.begin(), v2.end());  // 插入
        display(v1);
    }
    else
    {
        std::cout << "未找到" << std::endl;
    }
    // 结果:
    // 已找到
    // 1 2 3 4 10 20 30 40 50 5 
}
int main()
{

    // test1();
    // test2();
    // test3();
    // test4();
    // test5();
    // test6();
    // test7();
    // test8();
    test9();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默执_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值