C++ STL常用容器之vector(顺序容器)


前言

本文主要介绍C++ STL常用容器之vector(顺序容器)的相关概念以及用法。


一、vector的介绍

std::vector是C++标准模板库(STL)中的一个序列容器,提供了动态数组的功能。它可以存储任意类型的元素,并支持动态调整大小。vector在内存中连续存储元素,允许高效的随机访问。

1.1 vector的优点

动态扩展: std::vector 可以根据需要动态地增长或缩小其大小。当添加新元素时,如果当前的容量不足以容纳新元素,vector会分配更多的内存空间。

高效访问: std::vector 中的元素在内存中连续存储,这意味着可以通过下标快速访问任意位置的元素。

自动管理内存: std::vector 会自动管理其内部的内存分配和释放,不需要程序员显式地调用new和delete。

1.2 vector的缺点

插入和删除效率: 在std::vector的开头或中间位置插入或删除元素时,可能需要移动大量元素以保持连续性,这会导致效率较低。相比之下,在尾部插入或删除元素(使用push_back和pop_back)则非常高效。

空间浪费: 由于std::vector在增长时通常会分配比当前所需更多的内存空间,因此在某些情况下可能会浪费一些内存。

1.3 使用场景

需要动态数组的场景: 当需要存储动态大小的数组时,可以使用std::vector来代替传统的C风格数组。

需要高效访问的场景: 由于std::vector中的元素连续存储,因此可以通过下标快速访问任意位置的元素。这使得vector在处理需要频繁访问元素的应用场景时非常高效。

需要自动内存管理的场景: 使用std::vector可以避免手动管理内存的复杂性,减少内存泄漏和野指针等问题的发生。这对于那些需要处理大量动态数据的场景来说非常有用。

对性能要求不苛刻的场景: 虽然std::vector在插入和删除元素时可能不是最高效的容器,但在大多数情况下,其性能已经足够满足需求。因此,在对性能要求不苛刻的场景下,使用vector是一个很好的选择。

二、vector常用的操作

2.1 创建、初始化以及遍历容器

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    // 创建一个空的整型vector容器
    std::vector<int> vec1;

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

    // 创建一个指定大小为10,初始值为1的vector容器
    std::vector<int> vec3(10, 1);

    // 使用迭代器遍历
    std::cout << "vec1:" << std::endl;
    for (std::vector<int>::iterator it = vec1.begin(); it != vec1.end(); it++) {
        std::cout << *it << " ";
    }
    
    // 遍历 std::vector<int> 中的元素
    std::cout << std::endl << "vec2:" << std::endl;
    for (int elem : vec2) {
        std::cout << elem << " ";
    }

    // 使用auto自动推导变量类型进行遍历
    std::cout << std::endl << "vec3:" << std::endl;
    for (auto& value : vec3) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    return 0;

}

编译后输出如下

jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec1:

vec2:
1 2 3 4 5
vec3:
1 1 1 1 1 1 1 1 1 1
jeff@jeff:~/jeffPro/practice/grammar/c++$

2.2 查询容器大小

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    // 创建一个空的整型vector容器
    std::vector<int> vec1;

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

    // 检查vector是否为空
    bool isEmpty = vec1.empty(); 
    if (isEmpty)
        std::cout << "vec1 is Empty !" << std::endl;
    else
        std::cout << "vec1 is not Empty !" << std::endl;

    // 获取vector的大小
    int size = vec2.size(); 
    std::cout << "vec2 size is " << size << std::endl;

    return 0;

}

编译后输出如下

jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec1 is Empty !
vec2 size is 5
jeff@jeff:~/jeffPro/practice/grammar/c++$

2.3 访问容器中的元素

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    // 使用初始值列表初始化vector容器
    std::vector<int> vec2 = {1, 2, 3, 4, 5};

    // 访问第一个元素
    int firstElement = vec2[0];
    std::cout << "firstElement: " << firstElement << std::endl;

    // 访问第二个元素
    int secondElement = vec2.at(1);
    std::cout << "secondElement: " << secondElement << std::endl;

    return 0;

}

编译后输出如下

jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
firstElement: 1
secondElement: 2
jeff@jeff:~/jeffPro/practice/grammar/c++$

2.4 往容器中添加元素

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    // 使用初始值列表初始化vector容器
    std::vector<int> vec2 = {1, 2, 3, 4, 5};

    std::cout << "vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    // 在vector末尾添加元素10
    vec2.push_back(10);
    std::cout << std::endl << "after push back,vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    // 在vector开始位置插入元素0
    vec2.insert(vec2.begin(), 0);
    std::cout << std::endl << "after insert,vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    return 0;
}

编译后输出如下

jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec2:
1 2 3 4 5
after push back,vec2:
1 2 3 4 5 10
after insert,vec2:
0 1 2 3 4 5 10
jeff@jeff:~/jeffPro/practice/grammar/c++$

2.5 删除容器中的元素

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    // 使用初始值列表初始化vector容器
    std::vector<int> vec2 = {1, 2, 3, 4, 5};

    std::cout << "vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    // 删除vector最后一个元素
    vec2.pop_back();
    std::cout << std::endl << "after pop back,vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    // 删除vector第一个元素
    vec2.erase(vec2.begin());
    std::cout <<  std::endl << "after erase,vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

    std::cout << std::endl;

    return 0;
}

编译后输出如下

jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec2:
1 2 3 4 5
after pop back,vec2:
1 2 3 4
after erase,vec2:
2 3 4
jeff@jeff:~/jeffPro/practice/grammar/c++$

2.6 清空容器中的元素

// 清空容器中的所有元素
    vec2.clear();
    std::cout <<  std::endl << "after clear,vec2:" << std::endl;
    for (auto& value : vec2) {
        std::cout << value << " ";
    }

总结

std::vector 是C++ STL中非常重要且常用的容器类,提供了灵活的动态数组功能。通过上述示例代码,可以掌握vector的基本用法和操作方法。在实际编程中,可以根据具体需求选择合适的操作来管理和处理数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值