首页 > 编程语言 >C++ STL常用容器之vector(顺序容器)

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

时间:2024-07-14 09:29:27浏览次数:20  
标签:std 容器 cout jeff STL C++ vector vec2

文章目录


前言

本文主要介绍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的基本用法和操作方法。在实际编程中,可以根据具体需求选择合适的操作来管理和处理数据。

标签:std,容器,cout,jeff,STL,C++,vector,vec2
From: https://blog.csdn.net/Mr_Jaychong/article/details/140290013

相关文章

  • C++ //练习 14.44 编写一个简单的桌面计算器使其能处理二元运算。
    C++Primer(第5版)练习14.44练习14.44编写一个简单的桌面计算器使其能处理二元运算。环境:LinuxUbuntu(云服务器)工具:vim 代码块/************************************************************************* >FileName:ex14.44.cpp >Author: >Mail: >C......
  • Android C++系列:Linux常用函数和工具
    1.时间函数1.1文件访问时间#include<sys/types.h>#include<utime.h>intutime(constchar*name,conststructutimebuf*t);返回:若成功则为0,若出错则为-1如果times是一个空指针,则存取时间和修改时间两者都设置为当前时间;如果times是非空指针,则存取时......
  • Android C++系列:Linux进程间关系
    1.终端在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(ControllingTerminal),在前面文章我们说过,控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况......
  • C++ //练习 15.5 定义你自己的Bulk_quote类。
    C++Primer(第5版)练习15.5练习15.5定义你自己的Bulk_quote类。环境:LinuxUbuntu(云服务器)工具:vim 代码块/************************************************************************* >FileName:ex15.3.cpp >Author: >Mail: >CreatedTime:Fri12J......
  • C++ //练习 15.7 定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数
    C++Primer(第5版)练习15.7练习15.7定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出的部分将以原价销售。环境:LinuxUbuntu(云服务器)工具:vim 代码块/**************************......
  • Windows10下的docker容器启动命令docker -v相对路径的挂载目录位置
    今天研究docker容器时,启动命令使用到了docker-vtest:/app/backend/data有个从宿主机写入文件到容器这个目录的需求,于是就尝试在宿主机上找到这个test目录找了一圈都没找到,于是四处搜索,终于在stackoverflow上面找到了https://stackoverflow.com/questions/61083772/where-are-......
  • 模型部署 - TensorRT - C++版本与Python版本应如何选择
    从性能角度来看,TensorRTC++版本和Python版本之间确实存在一些差异:C++版本性能更优:TensorRTC++版本使用了更底层的API,可以更好地利用硬件特性,进行更深层的优化。C++版本在内存管理、CPU-GPU数据传输等方面更加高效,这些都可以带来更好的推理性能。Python版本更易......
  • c++初始化列表和构造函数初始化的区别
    在C++中,初始化列表和构造函数初始化是两种不同的方法用于初始化类的成员变量。初始化列表(InitializationList):初始化列表是在构造函数的参数列表后面使用冒号(:),然后跟随着每个成员变量的初始化方式。通过初始化列表,可以在对象构造时直接为成员变量赋值,而不是在构造函数体内......
  • C++客户端Qt开发——开发环境
    一、QT开发环境1.安装三个部分①C++编译器(gcc,cl.exe……)②QTSDKSDK-->软件开发工具包比如,windows版本QTSDK里已经内置了C++的编译器(内置编译器是mingw,windows版本的gcc/g++)③QT的集成开发环境(IDE)官方提供的QTCreator最容易入门,最容易上手的方式,开箱即用,虽然QTCrea......
  • C++ 入门基础:开启编程之旅
    引言C++是一种高效、灵活且功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为C语言的扩展,C++不仅继承了C语言的过程化编程特性,还增加了面向对象编程(OOP)的支持,使得代码更加模块化、易于管理和复用。本文将带你走进C++的世界,从......