首页 > 其他分享 >std::vector 和 std::list 区别

std::vector 和 std::list 区别

时间:2024-03-23 20:33:16浏览次数:13  
标签:std 元素 list lst vector include

std::vector 和 std::list 区别?

std::vector 和 std::list 是 C++ 标准库中两种不同的容器类型,它们之间有以下几个主要区别:

  1. 存储结构:
    • std::vector 是连续内存空间上的动态数组,元素在内存中是连续存储的。
    • std::list 是基于双向链表实现的,元素在内存中是非连续存储的。
  2. 访问效率:
    • std::vector 可以通过下标随机访问元素,时间复杂度为 O(1)。
    • std::list 需要顺序遍历才能访问特定元素,时间复杂度为 O(n)。
  3. 插入和删除效率:
    • std::vector 在中间插入或删除元素时需要移动其他元素,效率较低,时间复杂度为 O(n)。
    • std::list 在任意位置插入或删除元素都很高效,时间复杂度为 O(1)。
  4. 内存管理:
    • std::vector 需要分配连续的内存空间,当容量不足时需要重新分配内存并复制元素,效率相对较低。
    • std::list 在插入和删除时只需要修改指针,不需要移动元素,效率较高。
  5. 空间利用率:
    • std::vector 由于是连续存储,可以更好地利用缓存,空间利用率较高。
    • std::list 由于是链表结构,需要额外存储指针信息,空间利用率相对较低。

总的来说,std::vector 适合需要快速随机访问的场景,std::list 适合需要频繁插入和删除的场景。在选择使用哪种容器时,需要根据具体的应用需求进行权衡。

std::vector 的增删改查例子

#include <iostream>
#include <vector>

int main() {
    // 创建一个空的 std::vector
    std::vector<int> v;

    // 增
    // 在末尾追加元素
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    // 在指定位置插入元素
    v.insert(v.begin() + 1, 4);
    // v 此时为 {1, 4, 2, 3}

    // 查
    // 访问指定位置的元素
    std::cout << "Element at index 2: " << v[2] << std::endl;
    // 遍历所有元素
    std::cout << "All elements: ";
    for (int i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 改
    // 修改指定位置的元素
    v[2] = 5;
    // v 此时为 {1, 4, 5, 3}

    // 删
    // 删除指定位置的元素
    v.erase(v.begin() + 1);
    // v 此时为 {1, 5, 3}
    // 清空 vector
    v.clear();
    // v 此时为空

    return 0;
}

这个例子展示了 std::vector 的基本增删改查操作:

  1. 创建一个空的 std::vector。
  2. 使用 push_back() 在末尾追加元素,使用 insert() 在指定位置插入元素。
  3. 使用下标访问指定位置的元素,使用 for 循环遍历所有元素。
  4. 使用下标修改指定位置的元素。
  5. 使用 erase() 删除指定位置的元素,使用 clear() 清空整个 vector。

std::list 的增删改查例子

这里是一个 std::list 的增删改查操作的例子

#include <iostream>
#include <list>

int main() {
    // 创建一个空的 std::list
    std::list<int> lst;

    // 增
    // 在末尾追加元素
    lst.push_back(1);
    lst.push_back(2);
    lst.push_back(3);
    // 在头部插入元素
    lst.push_front(4);
    // lst 此时为 {4, 1, 2, 3}

    // 查
    // 访问头部元素
    std::cout << "Head element: " << lst.front() << std::endl;
    // 访问尾部元素
    std::cout << "Tail element: " << lst.back() << std::endl;
    // 遍历所有元素
    std::cout << "All elements: ";
    for (int i : lst) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 改
    // 修改指定位置的元素
    auto it = lst.begin();
    std::advance(it, 2);
    *it = 5;
    // lst 此时为 {4, 1, 5, 3}

    // 删
    // 删除头部元素
    lst.pop_front();
    // 删除尾部元素
    lst.pop_back();
    // 删除指定元素
    lst.remove(5);
    // lst 此时为 {1, 3}
    // 清空 list
    lst.clear();
    // lst 此时为空

    return 0;
}

这个例子展示了 std::list 的基本增删改查操作:

  1. 创建一个空的 std::list。
  2. 使用 push_back() 在末尾追加元素,使用 push_front() 在头部插入元素。
  3. 使用 front() 访问头部元素,使用 back() 访问尾部元素,使用 for 循环遍历所有元素。
  4. 使用迭代器 advance() 移动到指定位置,然后修改元素。
  5. 使用 pop_front() 删除头部元素,使用 pop_back() 删除尾部元素,使用 remove() 删除指定元素,使用 clear() 清空整个 list。

std::list 查找某个特定元素如何查找

在 std::list 中查找特定元素有几种方法:

1 使用 find() 算法:

#include <iostream>
#include <list>
#include <algorithm>

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

    // 查找元素 3
    auto it = std::find(lst.begin(), lst.end(), 3);
    if (it != lst.end()) {
        std::cout << "Found element: " << *it << std::endl;
    } else {
        std::cout << "Element not found" << std::endl;
    }

    return 0;
}

2 使用 std::list 的成员函数 find():

#include <iostream>
#include <list>

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

    // 查找元素 3
    auto it = lst.find(3);
    if (it != lst.end()) {
        std::cout << "Found element: " << *it << std::endl;
    } else {
        std::cout << "Element not found" << std::endl;
    }

    return 0;
}

3 使用 std::find_if() 算法,传入一个自定义的谓词函数:

#include <iostream>
#include <list>
#include <algorithm>

bool isEven(int x) {
    return x % 2 == 0;
}

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

    // 查找第一个偶数元素
    auto it = std::find_if(lst.begin(), lst.end(), isEven);
    if (it != lst.end()) {
        std::cout << "Found element: " << *it << std::endl;
    } else {
        std::cout << "Element not found" << std::endl;
    }

    return 0;
}

以上三种方法都可以用来在 std::list 中查找特定元素。其中,使用 std::find() 算法和 std::list 的成员函数 find() 可以查找特定值的元素,而使用 std::find_if() 算法可以查找满足自定义条件的元素。

标签:std,元素,list,lst,vector,include
From: https://www.cnblogs.com/yjf512/p/18091640

相关文章

  • 自己编译RustDesk,并将自建ID服务器和key信息写入客户端
    前言:搭建RustDesk编译环境    今天总算是把编译环境给折腾清楚了,编译出来了至少能用,但说不上好用,问题还不少,官方的客户端就是要手工填写ID服务器地址和key才可以用,而且还容易被别人白嫖你搭建的服务器,当然如果拿到你编译后的客户端,也是存在被白嫖的可能。这方面还没......
  • Collections工具类,可以使用collections工具类对代码中的list进行分组
    /***根据活动id进行分组*key活动id*value活动id对应的商品id*/Map<Long,Set<Long>>collect=activitySkuList.stream().collect(Collectors.groupingBy(ActivitySku::getActivityId......
  • Java学习笔记:ArrayList集合
    目录为什么要有集合:解决数组自动扩容的问题Java、python数据类型对比Java支持的数据类型主要分为两大类:Python支持多种数据类型,主要包括以下几种:在Java中常见的数据类型实现方式:Java通过使用集合框架来解决一组数据的存储和管理Java集合大致也可分成List、Set、Queue、Map四种接口......
  • 中考英语首字母快速突破014-2021上海徐汇英语二模-The Glamorous Life of TV Journali
    中考英语首字母快速突破014-2021上海徐汇英语二模-TheGlamorousLifeofTVJournalists-电视记者的风光生活PDF格式公众号回复关键字:ZKSZM014原文​HundredsofthousandsofpeopleoftenseetheirfacesontheTVscreen.Theymaybespeaking“live”from......
  • Imagen: Photorealistic Text-to-Image Diffusion Models with Deep Language Underst
    名称Imagen:PhotorealisticText-to-ImageDiffusionModelswithDeepLanguageUnderstanding时间:22/05机构:GoogleTL;DR发现使用LLM(T5)可以作为text2image任务的textencoder,并且提升LLM模型size相对于提升imageDM模型size性价比更高,生成的图像保真度更高,内容也更符合文......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......
  • HDLbits 刷题 -- Vector4
    学习:        连接操作符允许将向量连接在一起形成一个更大的向量。但有时您希望将相同的内容多次连接在一起,这样做仍然很繁琐,例如assigna={b,b,b,b,b};。复制操作符允许重复一个向量并将它们连接在一起:        {num{vector}}  这是将向量复制了num次......
  • vector resize和reserve的区别
    在C++的标准库中,resize()和reserve()是用于操作std::vector容器的两个不同函数,它们的作用和效果有所区别。resize()函数resize()函数用于改变std::vector容器的大小,即调整容器中元素的数量。如果当前vector的大小小于指定的大小,resize()会在容器末尾添加默认构......
  • 利用EasyPoi 实现 传入List数据,输出excel文件
    基本描述场景用户传入List数据,要求生成Excel文件(糟糕的需求是真糟糕!!!)本次算是未完成版[应付需求还是可以的](需要硬代码去编写模板,各位宝子们先将就下,后续会跟新传参版)特别提醒时间字段我们当做字符处理的写模板的时候不要用format属性(暂无特别好的解决方案,有大神可以以指......
  • ArrayList的扩容机制以及ArrayList与LinkedList的区别
    ArrayList的扩容机制假设采用无参构造器来实列化ArrayList对象ArrayListarrayList=newArrayList();此时,arrayList的初始容量为零,当第一次调用add方法时,会触发扩容机制,容量扩容为10。此后,在调用add方法时,如果容量不足,则容量会扩容为当前容量的1.5倍。capcity=capacity......