Standard Template Library Basis [3] List

本文深入探讨了C++标准库中的list容器,包括基本操作、排序、翻转、resize方法及迭代器特性等,并通过示例代码展示了list与其他数据结构如vector的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        先回顾以下数据结构的内容:线性表包括:顺序表(vector)、链表(list),list是双向链表,注意头文件#include<list>

        注:代码不含检验代码

 [1] list与vector相似的用法
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
    list<int> a1;
    int b1[]={1,2,3,4,5,6};
    list<int> a2(b1,b1+6);//【注】对于list中的元素的访问只能用迭代子 不能直接用a2[3]
    for(list<int>::iterator p=a2.begin();p!=a2.end();p++)
    {
        cout<<*p<<" ";
    }
    cout<<endl;
    
    list<int> a3(a2);
    list<int> a4=a2;//同vector
    
    list<int> a5(10);//10个0
    list<int> a6(10,90);//10个90
    
    list<int> a7={2,3,4,5};//c++11
    
    //a7.empty()用法同vector
    //a7.size()用法同vector
    //a7>a6 字典序比较
    //a7.assign(a6.begin(),a6.end());
    
    //a7.swap(a6); 同vector
    //a7.front()第一个元素  a7.back()最后一个元素
    //const 也一样:const的容器一定要用const的迭代子
    
    return 0;
}
 [2] list中元素的增加和删除
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
    int b[]={1,2,3,4,5,6};
    list<int> a1(b,b+6);
    a1.push_back(100);
    a1.push_front(-1);//时间复杂度o(1)
    a1.pop_back();//删除最后一个元素
    a1.pop_front();//删除第一个元素
    
    vector<int> a2={1,2,3,4,5,6};
    a2.insert(a2.begin(),-1);//时间复杂度o(n)
    
    //insert用法
    list<int> a3={1,2,3,4,5,6};
    list<int>::iterator p1=a3.begin();//不能直接加
    p1++;
    p1++;
    a3.insert(p1,3,-2);//插入3个-2
    //同样满足 a3.insert(p1,p开头,p结尾);
    //同样满足 a3.insert(p1,{1,2,3});

    //删除元素的操作【与vector不同】
    list<int> a4={-1,90,-1,80,89,56,-1};
    a4.remove(-1);
    //a6.remove(函数对象)、a6.remove(函数)也成立
    
    list<int> a5={1,2,3,4,5,6};
    list<int>::iterator p5=a5.begin();//不能直接加
    p1++;
    p1++;
    a5.erase(p1);//也成立
    //a5.erase(p1,p2);也成立
    
    return 0;
}
 [3] list中的unique操作
#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
bool IsEqual(string a, string b)
{
    return a.size() == b.size();
}
int main()
{
    //list::unique 将连续的等价只剩下一个
    //1 8 8 8 8 9 9 9 8 ==》1 8 9 8
    list<int> a1={1,2,3,4};
    a1.unique();
    
    //这个等价可以自己定义
    string a="hello";
    cout<<a.size()<<endl;
    cout<<a.length()<<endl;
    //比方说将字符串的长度相同定义为相等
    list<string> a2={"hello","nihao","aaaaa","a","aa","bb","cc","jhdfksj"};
    a2.unique(IsEqual);
    return 0;
}

 [3] list中的splice操作

#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
int main()
{
    //splice 绞合(被搬运的list自己变空)时间复杂度o(1)
    list<int> a1={1,2,3,4,5,6};
    list<int> a2={5,6,7,7,7};
    list<int>::iterator p1=a1.begin();
    p1++;
    p1++;
    a1.splice(p1,a2);
    cout<<endl;
    cout<<a2.size()<<endl;//此时a2变空
    
    //部分搬运
    list<int>::iterator p2=a2.begin();
    p2++;
    list<int>::iterator p3=a2.end();
    p3--;
    p3--;
    a1.splice(p1,a2,p2,p3);//【注意】要写a2
    a1.splice(p1,a2,p2);//将a2中的p2塞到p1里面
    
    return 0;
}
 [4] list中的merge操作: 

单调递增:

#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
    //merge 将两个[有序]链表重新合成一个有序链表,被搬的list变空
    list<int> a1={1,3,5,5,6,7,8};
    list<int> a2={2,3,4,5,5,5};
    a1.merge(a2);
    return 0;
}
单调递减型
#include<iostream>
#include<vector>
#include<list>
#include<functional>//greater<int>()需要头文件
using namespace std;
int main()
{
    //merge 将两个[有序]链表重新合成一个有序链表,被搬的list变空
    //顺序为从大到小
    list<int> a1={8,3,4,1};
    list<int> a2={13,5,4,3,2};
    a1.merge(a2,greater<int>());
    for(list<int>::iterator p=a1.begin();p!=a1.end();p++)
    {
        cout<<*p<<" ";
    }
    cout<<endl;
    return 0;
}
 [5] 对于list的排序:

先回顾下对vector的排序:使用通用算法

#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>//sort是个通用算法
using namespace std;
int main()
{
    vector<int> v={6,3,5,2,5};
    sort(v.begin(),v.end(),greater<int>());
    for(vector<int>::iterator p=v.begin();p!=v.end();p++)
    {
        cout<<*p<<" ";
    }
    cout<<endl;
    return 0;
}

对于list,使用成员函数

#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
    //sort
    list<int> a1={8,3,4,1};
    a1.sort();
    a1.sort(greater<int>());
    cout<<endl;
    return 0;
}

也支持自定义排序(函数以及函数对象)

#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
bool MyCmp(string a, string b)
{
    return a.size()<b.size();
}
int main()
{
    //自定义排序(函数)
    list<string> a1={"hello","fhjdhs","a","ss88dd","sd"};
    a1.sort(MyCmp);
    return 0;
}
 [6] 对于list的翻转:
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
    //reverse翻转
    list<int> a3={8,3,4,1};
    a3.reverse();
    
    return 0;
}
[7] list.resize()
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
    //自定义排序
    list<int> a1={1,2,3,4,5,6};
    a1.resize(4);
    //若a1.resize(10);//后面填充0
    //若a1.resize(10,-2);//后面填充-1
    return 0;
}
[8] list.emplace(), list.emplace_back(), list.emplace_front()
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
class MyTest
{
public:
    MyTest(int a, int b)
    {
        x=a,y=b;
    }
    int x;
    int y;
};
int main()
{
    //1.emplace
    //2.emplace_back
    //3.emplace_front
    MyTest b1(1,5);
    MyTest b2(2,5);
    MyTest b3(3,5);
    MyTest b4(4,5);
    MyTest b5(5,5);
    MyTest b6(6,5);
    list<MyTest> a1;
    a1.push_back(b1);
    a1.push_back(b2);
    a1.push_back(b3);
    a1.push_back(b4);
    a1.push_back(b5);
    a1.push_back(b6);
    a1.emplace_front(0,0);
    a1.emplace_back(100,100);
    
    list<MyTest>::iterator p1=a1.begin();
    p1++;
    p1++;
    a1.emplace(p1,990,990);//在第三个位置插入新的
    
    return 0;
}
[9]list的迭代子不会失效
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
    //迭代子不会失效
    list<int> a1={1,2,3,4,5,6};
    list<int>::iterator p1=a1.begin();
    p1++;
    p1++;
    list<int>::iterator p2=a1.end();
    p2--;
    p2--;
    a1.erase(p1);
    cout<<*p2<<endl;//依旧指向5
    
    return 0;
}


资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 JavaScript 中实现点击展开与隐藏效果是一种非常实用的交互设计,它能够有效提升用户界面的动态性和用户体验。本文将详细阐述如何通过 JavaScript 实现这种功能,并提供一个完整的代码示例。为了实现这一功能,我们需要掌握基础的 HTML 和 CSS 知识,以便构建基本的页面结构和样式。 在这个示例中,我们有一个按钮和一个提示框(prompt)。默认情况下,提示框是隐藏的。当用户点击按钮时,提示框会显示出来;再次点击按钮时,提示框则会隐藏。以下是 HTML 部分的代码: 接下来是 CSS 部分。我们通过设置提示框的 display 属性为 none 来实现默认隐藏的效果: 最后,我们使用 JavaScript 来处理点击事件。我们利用事件监听机制,监听按钮的点击事件,并通过动态改变提示框的 display 属性来实现展开和隐藏的效果。以下是 JavaScript 部分的代码: 为了进一步增强用户体验,我们还添加了一个关闭按钮(closePrompt),用户可以通过点击该按钮来关闭提示框。以下是关闭按钮的 JavaScript 实现: 通过以上代码,我们就完成了点击展开隐藏效果的实现。这个简单的交互可以通过添加 CSS 动画效果(如渐显渐隐等)来进一步提升用户体验。此外,这个基本原理还可以扩展到其他类似的交互场景,例如折叠面板、下拉菜单等。 总结来说,JavaScript 实现点击展开隐藏效果主要涉及 HTML 元素的布局、CSS 的样式控制以及 JavaScript 的事件处理。通过监听点击事件并动态改变元素的样式,可以实现丰富的交互功能。在实际开发中,可以结合现代前端框架(如 React 或 Vue 等),将这些交互封装成组件,从而提高代码的复用性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值