C++初阶——list

news/2024/11/17 9:24:43/

一、什么是list

        list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来,内部保持了顺序。

二、list的构造

构造函数接口说明
list(size_type n,const value_type& val = valur_type())为构造的list,初始化n个空间,并根据第二个参数进行初始化
list()构造空的list
list(const list* x)拷贝构造函数
list(Inputlterator first, Inputlterator last)使用迭代器区间中的元素进行初始化

函数原型:

explicit list ();explicit list (size_type n, const value_type& val = value_type());template <class InputIterator>list (InputIterator first, InputIterator last);list (const list& x);

list的构造使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<int> first;//无参构造list<int> second(10, 1);//构造的list中包含10个1list<int> third(s.begin() + 5, s.end());//迭代器构造list<int> fourth(third);//拷贝构造函数return 0;
}

三、list的迭代器

        迭代器,按照访问方式可以分为以下三种:

  • 前向迭代器(Forward Iterators):它支持多次遍历,只能递增不能递减。
  • 双向迭代器(Bidirectional Iterators):与前向迭代器类似,但是既能递增也能递减。
  • 随机迭代器(Random Access Iterators):它支持所有双向迭代器的操作,支持跳过元素,支持下标访问,支持比较操作。

        list的迭代器属于双向迭代器,也就是说list不能像vector和数组那样通过[]进行访问。

函数声明接口说明
begin+endbegin返回第一个元素的迭代器,end返回逻辑上最后一个元素之后的位置
rbegin+rendrbegin返回最后一个元素的迭代器,这个迭代器指向的是理论上位于容器第一个元素之前的元素,即它不指向容器中的任何实际元素。

函数原型为:

iterator begin() noexcept;
const_iterator begin() const noexcept;iterator end() noexcept;
const_iterator end() const noexcept;reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

迭代器的使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(), s.end());list<char>::iterator it = first.begin();list<char>::reverse_iterator r_it = first.rbegin();cout << "正向迭代器:";while (it != first.end()){cout << *it << " ";++it;}cout << endl;cout << "反向迭代器:";while (r_it != first.rend()){cout << *r_it << " ";++r_it;}
}

 输出结果为:

四、list的容量相关

函数声明        接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

函数原型为: 

size_type size() const noexcept;bool empty() const noexcept;

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{list<int> first;list<int> second(10, 1);cout << first.empty() << endl;cout << second.empty() << endl;cout << first.size() << endl;cout << second.size() << endl;
}

五、list的访问

函数声明接口说明
front返回lsit的第一个节点的值的引用
back返回list的最后一个节点的值的引用

函数原型为:

reference front();
const_reference front() const;reference back();
const_reference back() const;

 函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.end());cout << first.front() << " " << first.back();
}

 输出结果为:

六、list的修改

函数声明接口说明
push_front在list首元素前插入一个值
pop_front删除list中的第一个元素
push_back在尾部插入一个值
pop_back删除list的最后一个元素
insert在给定的迭代器对应位置插入元素
erase删除迭代器对应的元素
swap交换两个list中的元素

push_front和pop_front

函数原型:

void push_front (const value_type& val);
void push_front (value_type&& val);void pop_front();

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.end());first.push_front('k');cout << first.front() << endl;first.pop_front();cout << first.front() << endl;
}

输出结果:

push_back和pop_back 

函数原型:

void push_back (const value_type& val);
void push_back (value_type&& val);void pop_back();

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.end());first.push_back('k');cout << first.back() << endl;first.pop_back();cout << first.back() << endl;
}

输出结果:

insert函数 

函数原型:

iterator insert (const_iterator position, const value_type& val);iterator insert (const_iterator position, size_type n, const value_type& val);template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.end());first.insert(first.begin(), 'c');first.insert(first.begin(), 10, 'c');first.insert(first.begin(), s.begin(), s.end());
}

erase函数

函数原型:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.end());first.erase(first.begin(), first.end());
}

swap函数

函数原型:

void swap (list& x);

函数使用:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string s("hello world");list<char> first(s.begin(),s.begin() + 5);list<char> second(s.begin() + 5, s.end());first.swap(second);
}

七、list的操作

函数声明接口说明
reverse反转容器中元素的顺序
sort排序list中的元素,默认升序
merge合并两个列表,它们必须是有序的
unique消除列表中的重复元素,必须是有序的
remove移除给定的元素
splice将一个列表中的一个或一部分元素转移到另一个元素中

reverse函数

函数原型:

void reverse() noexcept;

函数使用:

#include <list>
#include <iostream>
using namespace std;int main() {list<int> first = { 1, 3, 5 };first.reverse();for (auto i : first){cout << i << " ";}
}

输出结果为:

sort函数

函数原型:

void sort();template <class Compare>void sort (Compare comp);

函数使用:

#include <list>
#include <iostream>
using namespace std;int main() {list<int> first = { 4,5,2,1,7,5,9 };first.sort();//默认升序//也可以写成first.sort(less<int>());for (auto i : first){cout << i << " ";}cout << endl;first.sort(greater<int>());//改为降序for (auto i : first){cout << i << " ";}
}

 输出结果:

merge函数

函数原型

void merge (list& x);template <class Compare>void merge (list& x, Compare comp);

        comp是一个比较函数或比较器,它接受两个参数并返回一个布尔值,指示第一个参数是否应该在排序顺序中排在第二个参数之前。这个比较函数应该产生一个严格的弱排序。该函数将参数列表中序列x中的所有元素合并到当前列表中,同时保持排序顺序。两个列表在合并操作之前都必须根据comp提供的比较标准进行排序。

函数使用:

#include <list>
#include <iostream>
using namespace std;int main() {list<int> first= { 1, 3, 5 };list<int> second= { 2, 4, 6 };// 使用自定义比较函数将 list2 合并到 list1first.merge(second, less<int>());// 打印合并后的列表for (int num : first) {cout << num << " ";}cout << endl;// 合并后 list2 应该为空if (second.empty()) {cout << "合并后second 为空。" << endl;}return 0;
}

输出结果为:

unique函数

函数原型:

void unique();template <class BinaryPredicate>void unique (BinaryPredicate binary_pred);

函数使用:

#include <list>
#include <iostream>
using namespace std;
int main() {std::list<int> first = { 1, 2, 2, 3, 3, 3, 4, 4, 5 };first.unique();// 打印列表for (int num : first) {std::cout << num << " ";}cout << std::endl;// 使用带参数版本的 unique 函数list<int> second = { 1, 2, 2, 3, 3, 3, 4, 4, 5 };second.unique(std::equal_to<int>());// 打印列表for (int num : second) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出结果为:

remove函数

函数原型:

void remove (const value_type& val);

函数使用:

#include <list>
#include <iostream>
using namespace std;
int main() {std::list<int> first = { 1, 2, 2, 3, 4, 2, 5 };first.remove(2);for (int num : first) {cout << num << " ";}cout << endl;return 0;
}

输出结果:

splice函数 

函数原型:

void splice (const_iterator position, list& x);void splice (const_iterator position, list& x, const_iterator i);void splice (const_iterator position, list& x,const_iterator first, const_iterator last);

代码使用:

#include <list>
#include <iostream>
using namespace std;int main() {list<int> first = { 1, 2, 3 };list<int> second = { 4, 5, 6 };first.splice(first.end(), second);cout << "first: ";for (int num : first) {cout << num << " ";}cout << endl;first.splice(first.end(), first, next(first.begin(), 1));cout << "first after moving second element: ";for (int num : first) {cout << num << " ";}cout << endl;first.splice(second.end(), first, first.begin(), next(first.begin(), 3));cout << "second after moving elements: ";for (int num : second) {cout << num << " ";}cout << endl;return 0;
}

输出结果为:


http://www.ppmy.cn/news/1547689.html

相关文章

LSTM(长短期记忆网络)详解

1️⃣ LSTM介绍 标准的RNN存在梯度消失和梯度爆炸问题&#xff0c;无法捕捉长期依赖关系。那么如何理解这个长期依赖关系呢&#xff1f; 例如&#xff0c;有一个语言模型基于先前的词来预测下一个词&#xff0c;我们有一句话 “the clouds are in the sky”&#xff0c;基于&…

精密机加工 —— 工业制造的核心力量!

在现代工业制造的广袤领域中&#xff0c;精密机加工犹如一颗璀璨的明珠&#xff0c;是推动整个工业体系向前发展的核心力量。 精密机加工是一种利用高精度的机械设备和先进工艺技术&#xff0c;对原材料进行精细加工&#xff0c;从而制造出符合特定精度要求和复杂形状零部件的制…

ctfshow-web入门-JWT(web345-web350)

目录 1、web345 2、web346 3、web347 4、web348 5、web349 6、web350 1、web345 F12 看到提示 但是访问 admin 会重定向到 index.php 提取 jwt 解码 eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3MzE2NDYzOTQsImV4cCI6MTczMTY1MzU5NCwibmJmIj…

pom中无法下载下来的类外部引用只给一个jar的时候

比如jar在桌面上放着,操作步骤如下&#xff1a; 选择桌面&#xff0c;输入cmd ,执行mvn install:install-file -DgroupIdcom -DartifactIdaspose-words -Dversion15.8.0 -Dpackagingjar -Dclassifierjdk11 -Dfilejar包名称 即可把jar包引入成功。

JAVA接入WebScoket行情接口

Java脚好用的库很多&#xff0c;开发效率一点不输Python。如果是日内策略&#xff0c;需要更实时的行情数据&#xff0c;不然策略滑点太大&#xff0c;容易跑偏结果。 之前爬行情网站提供的level1行情接口&#xff0c;实测平均更新延迟达到了6秒&#xff0c;超过10只股票并发请…

SwiftUI开发教程系列 - 第十二章:本地化与多语言支持

随着应用程序的全球化需求增加&#xff0c;为了方便不同地区的用户&#xff0c;支持多语言和本地化变得越来越重要。SwiftUI 为开发者提供了便捷的本地化方法&#xff0c;让应用能够根据用户的设备语言自动适配。 12.1 本地化的基本概念 本地化&#xff08;Localization&…

【Android】逆向开发与反逆向开发入门知识(一)

目录 逆向开发反编译 & 反混淆反编译工具反编译反混淆 修改预置资源文件抓包前期准备二次打包重签名 如何预防 App 被逆向开发&#xff1f;代码混淆应用加固防止动态调试Root 检测二次打包检测 警告&#xff1a;逆向开发相关知识请在法律规定范围内使用&#xff0c;请勿使用…

安卓studio的那些坑

今天用安卓studio运行项目的时候&#xff0c;总是报错虚拟内存不够&#xff0c;设备AVD启动不起来&#xff0c;然后查了半天也没找到问题&#xff0c;因为项目再别人电脑是可以的&#xff0c;才发现新建设备的时候 RAM才2g&#xff0c;&#xff0c;&#xff0c;关键塔还是禁用编…