0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++学习笔记之顺序容器

jf_78858299 来源:QStack 作者:月下西楼 2023-05-11 17:05 次阅读

背景

C++中的顺序容器是一种用于存储和管理元素序列的数据结构。它们提供了一组有序的元素,并支持在序列的任意位置插入和删除元素。C++标准库中提供了多种顺序容器,包括vector、deque、list、forward_list和array。

vector

vector是一种动态数组,它可以在序列的末尾快速添加和删除元素。vector的元素在内存中是连续存储的,因此可以通过指针访问元素,也可以使用迭代器遍历元素。vector的大小可以动态调整,但是在插入或删除元素时可能需要重新分配内存,因此可能会导致性能问题。以下是vector的一些常规操作:

  • push_back:在序列的末尾添加一个元素。传入参数为要添加的元素。
  • pop_back:从序列的末尾删除一个元素。无需传入参数。
  • insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
  • erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
  • size:返回序列中元素的数量。无需传入参数。
  • empty:检查序列是否为空。无需传入参数。
  • clear:删除序列中的所有元素。无需传入参数。 以下是一个使用vector存储整数的例子:
#include 
#include 

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    v.push_back(6);
    v.pop_back();
    auto it = v.begin();
    std::advance(it, 2);
    v.insert(it, 7);
    it = v.begin();
    std::advance(it, 4);
    v.erase(it);
    for (auto i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

在这里,我们使用vector存储整数,并在序列的末尾添加和删除元素,以及在序列的任意位置插入和删除元素。我们使用push_back函数在序列的末尾添加一个元素,使用pop_back函数从序列的末尾删除一个元素,使用begin函数获取vector的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历vector中的元素,并将它们打印到控制台上。

deque

deque是一种双端队列,它可以在序列的两端快速添加和删除元素。deque的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。deque的大小可以动态调整,但是在插入或删除元素时可能需要重新分配内存,因此可能会导致性能问题。以下是deque的一些常规操作:

  • push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
  • push_back:在序列的后面添加一个元素。传入参数为要添加的元素。
  • pop_front:从序列的前面删除一个元素。无需传入参数。
  • pop_back:从序列的后面删除一个元素。无需传入参数。
  • insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
  • erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
  • size:返回序列中元素的数量。无需传入参数。
  • empty:检查序列是否为空。无需传入参数。
  • clear:删除序列中的所有元素。无需传入参数。 以下是一个使用deque存储字符串的例子:
#include 
#include 

int main() {
    std::deque

在这里,我们使用deque存储字符串,并在序列的两端添加和删除元素,以及在序列的任意位置插入和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用push_back函数在序列的后面添加一个元素,使用pop_front函数从序列的前面删除一个元素,使用pop_back函数从序列的后面删除一个元素,使用begin函数获取deque的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历deque中的元素,并将它们打印到控制台上。

list

list是一种双向链表,它可以在序列的任意位置快速添加和删除元素。list的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。list的大小可以动态调整,但是在插入或删除元素时不需要重新分配内存,因此不会导致性能问题。

以下是list的一些常规操作:

  • push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
  • push_back:在序列的后面添加一个元素。传入参数为要添加的元素。
  • insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
  • erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
  • size:返回序列中元素的数量。无需传入参数。
  • empty:检查序列是否为空。无需传入参数。
  • clear:删除序列中的所有元素。无需传入参数。 以下是一个使用list存储浮点数的例子:
#include 
#include 

int main() {
    std::list<double> l = {1.1, 2.2, 3.3, 4.4, 5.5};
    l.push_front(0.0);
    l.push_back(6.6);
    auto it = l.begin();
    std::advance(it, 2);
    l.insert(it, 2.0);
    it = l.begin();
    std::advance(it, 4);
    l.erase(it);
    for (auto d : l) {
        std::cout << d << " ";
    }
    std::cout << std::endl;
    return 0;
}

在这里,我们使用list存储浮点数,并在序列的任意位置添加和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用push_back函数在序列的后面添加一个元素,使用begin函数获取list的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历list中的元素,并将它们打印到控制台上。

forward_list

forward_list是一种单向链表,它可以在序列的任意位置快速添加和删除元素。forward_list的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。forward_list的大小可以动态调整,但是在插入或删除元素时不需要重新分配内存,因此不会导致性能问题。以下是forward_list的一些常规操作:

  • push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
  • insert_after:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
  • erase_after:从序列的任意位置删除一个元素。传入参数为要删除元素的前一个元素的迭代器。
  • size:返回序列中元素的数量。无需传入参数。
  • empty:检查序列是否为空。无需传入参数。
  • clear:删除序列中的所有元素。无需传入参数。 以下是一个使用forward_list存储整数的例子:
#include 
#include 

int main() {
    std::forward_list<int> fl = {1, 2, 3, 4, 5};
    fl.push_front(0);
    auto it = fl.before_begin();
    std::advance(it, 2);
    fl.insert_after(it, 2);
    it = fl.before_begin();
    std::advance(it, 4);
    fl.erase_after(it);
    for (auto i : fl) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

在这里,我们使用forward_list存储整数,并在序列的任意位置添加和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用before_begin函数获取forward_list的前向迭代器,并使用advance函数将迭代器移动到指定位置的前一个位置,然后使用insert_after函数在指定位置插入一个元素,使用erase_after函数从指定位置删除一个元素。最后,我们使用循环遍历forward_list中的元素,并将它们打印到控制台上。

array

rray是一种固定大小的数组,它可以快速访问元素。array的元素在内存中是连续存储的,因此可以通过指针访问元素,也可以使用迭代器遍历元素。array的大小是固定的,因此不能动态调整大小。

以下是array的一些常规操作:

  • at:访问指定位置的元素。传入参数为元素的索引
  • operator[]:访问指定位置的元素。传入参数为元素的索引。
  • front:访问序列的第一个元素。无需传入参数。
  • back:访问序列的最后一个元素。无需传入参数。
  • size:返回序列中元素的数量。无需传入参数。
  • empty:检查序列是否为空。无需传入参数。

以下是一个使用array存储字符的例子:

#include 
#include 

int main() {
    std::array<char, 5> a = {'h', 'e', 'l', 'l', 'o'};
    std::cout << a.at(0) << " ";
    std::cout << a[1] << " ";
    std::cout << a.front() << " ";
    std::cout << a.back() << " ";
    std::cout << a.size() << " ";
    std::cout << std::boolalpha << a.empty() << std::endl;
    return 0;
}

在这里,我们使用array存储字符,并访问序列的元素。我们使用at函数和operator[]运算符访问指定位置的元素,使用front函数和back函数访问序列的第一个元素和最后一个元素,使用size函数返回序列中元素的数量,使用empty函数检查序列是否为空。最后,我们将访问到的元素和序列的信息打印到控制台上。

最后

在实际编程中,我们需要根据不同的需求选择合适的顺序容器。例如,如果需要快速在序列的末尾添加和删除元素,可以选择vector;如果需要快速在序列的两端添加和删除元素,可以选择deque;如果需要快速在序列的任意位置添加和删除元素,可以选择list或forward_list;如果需要快速访问元素,可以选择array。在选择容器时,需要考虑容器的特点、用法和性能,以便选择最合适的容器。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72901
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39903
  • Vector
    +关注

    关注

    3

    文章

    45

    浏览量

    8412
收藏 人收藏

    评论

    相关推荐

    学习C++

    急需C++学习资料,有的可以联系我或发我的邮箱,邮箱是liwenlong526@126.com
    发表于 11-24 12:50

    c++学习资料

    C++学习资料
    发表于 07-26 17:45

    【请教】如何进阶c++学习avr

    我是新手,有c语言基础,单片机基础,想学习avr和c++以及vc++,请问过来人和各路高手支招,如何继续进阶学习?看书还是看视频?有没有好的书或者视频推荐?(有孙鑫的mfc,但是现在还
    发表于 04-15 00:17

    学习C++

    有意学习C++的朋友,可以加QQ群383309549,完全公益,免费授课,本群只接受没有程序设计经验、想学习C++程序设计的朋友哟!!{:1:}
    发表于 07-29 21:51

    C++笔记003:C++从一个小程序开始

    ` 本帖最后由 tyyhmtyyhm 于 2018-5-12 09:37 编辑 笔记三:从一个小程序开始安装好VS2010后,从第一个小程序开始。在学习C语言时,我首先输出了一个程序员非常
    发表于 03-05 12:51

    C++笔记004:C++类通俗点说—— C结构体复习

    !万分感激!该资料需要读者具备一定的C语言编程基础!从今天开始我们就起步做有关C++编程资料的整理,我们也正在学习C++,所以从一个初学者的角度去把握用怎样的切入点能让初学者看得过瘾,
    发表于 03-05 12:53

    学习c++的经验分享!

    转自:http://www.cndzz.com/download/4094_0/111678.html 学习学好c++的50条忠告1.把C++当成一门新的语言学习(和
    发表于 10-08 03:46

    C++标准库学习笔记重点

    pair,key是排序准则的基准,只能出现一次,索引可为任意类型。(4)Multimap:允许元素的key相同,可当做字典使用。30.无序容器: 缺点,当新存入一个值后会打破现有顺序。优点,当你打算
    发表于 10-23 20:28

    如何学习C++,如何学好C++

    最近,很多学员都给我发邮件问我应该如何学习C++,如何学好C++?那么作为一个从C语言小白摸爬滚打、入坑无数到成长为如今的高级C++游戏开发
    发表于 08-20 06:27

    Linux C/C++ 学习路线相关资料下载

    一、秋招 Linux C/C++ offer 情况二、Linux C/C++ 方向的一些思考三、计算机基础知识的梳理四、C++ 方向的深入
    发表于 11-11 06:36

    如何学习编程c++语言?

      如何学习编程c++语言?粤嵌来讲解嵌入式C语言在各种项目中要用到的知识点,尤其是嵌入式C语言之变量与常量的内容:   1、变量类型和表示方法   如何
    发表于 12-15 08:28

    学习C++的方法以及C++的就业方向

    学习方向:嵌入式+人工智能嵌入式是一门技术学习目标1.嵌入式开发概述;(面向对象在嵌入式开发中角色)2.嵌入式Linux C++编程;(C++概述、
    发表于 12-24 07:32

    在main文件中怎样去使用C++

    ESP32 ESP-IDF 学习笔记(五 - 2)【使用C++的工程】文章目录ESP32 ESP-IDF
    发表于 01-07 07:44

    ESP32ESP-IDF学习笔记

    ESP32 ESP-IDF 学习笔记(六)【I2C数据总线(I²C)】文章目录ESP32
    发表于 02-22 07:30

    C++学习笔记c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助
    的头像 发表于 03-17 13:57 514次阅读