【C++STL基础入门】list的增、删

简介: 【C++STL基础入门】list的增、删

前言


在C++中,STL(Standard Template Library)是一个功能强大且常用的程序库,它为我们提供了许多容器和算法,使得编写高效且可维护的代码变得更加容易。其中,list是STL中的一个双向链表容器,它可以在任意位置高效地插入和删除元素。本文将介绍list容器的基本用法,包括如何增加和删除其中的元素。


一、list迭代器


1.1 list迭代器的定义


二、list增


2.1 头添加

1、push_front(const TYPE &val )

功能:将元素 val 插入到list容器的开头。

参数:val - 要插入的元素的值。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_front(10);
    myList.push_front(5);
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:5 10
    return 0;
}


1914e98bc2fd4ede9ae69bf6a0bb8f7b.png

2.2 尾添加

2、void push_back( const TYPE &val );

功能:将元素 val 插入到list容器的末尾。

参数:val - 要插入的元素的值。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(5);
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 5
    return 0;
}


5308a6729828441391609123084c6194.png

2.3 中间添加

1、iterator insert( iterator loc, const TYPE &val );

功能:将元素 val 插入到迭代器 loc 所指示的位置之前。

参数:loc - 指向插入位置的迭代器;val - 要插入的元素的值。

返回值:指向插入的元素的迭代器。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, 15); // 在第二个元素之前插入15
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 15 20 30
    return 0;
}


3d9ffe1176f449b49cc4d2c1c9f97d62.png

2、void insert( iterator loc, size_type num, const TYPE &val );


功能:将 num 个值为 val 的元素插入到迭代器 loc 所指示的位置之前。

参数:loc - 指向插入位置的迭代器;num - 要插入的元素的数量;val - 要插入的元素的值。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, 2, 15); // 在第二个元素之前插入两个值为15的元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 15 15 20 30
    return 0;
}


28ade18fc8244d36b23c787b133eca2b.png

3、void insert( iterator loc, input_iterator start, input_iterator end );

功能:将范围 [start, end) 的元素插入到迭代器 loc 所指示的位置之前。

参数:loc - 指向插入位置的迭代器;start 和 end - 定义要插入范围的迭代器。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
#include <vector>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    std::vector<int> myVector{5, 15};
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, myVector.begin(), myVector.end()); // 在第二个元素之前插入myVector的元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 5 15 20 30
    return 0;
}


f5ddff6db8f547ae9be00ef5ab780649.png


三、list删


3.1 尾删除

1、void pop_back();

功能:从list容器的末尾删除一个元素。

参数:无参数。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    myList.pop_back(); // 删除末尾元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 20
    return 0;
}


c865592cad4a454aa75c3af670a8b95e.png

3.2 头删除

1、pop_front()

功能:从list容器的开头删除一个元素。

参数:无参数。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    myList.pop_front(); // 删除开头元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:20 30
    return 0;
}


fa15c2e4bc3e44a1b8b0291bc1155f15.png

3.3 删除指定元素

1、 iterator erase( iterator loc );

功能:删除迭代器 loc 所指示的元素。

参数:loc - 指向要删除元素的迭代器。

返回值:指向被删除元素之后位置的迭代器。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.erase(it); // 删除第二个元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 30
    return 0;
}


325b9148e04a4c91bfbd5784e5fa858e.png

2、 iterator erase( iterator start, iterator end );

功能:删除位于范围 [start, end) 内的元素。

参数:start 和 end - 定义要删除范围的迭代器。

返回值:指向被删除元素后位置的迭代器。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    auto start = myList.begin(); // 指向第一个元素的迭代器
    auto end = myList.end(); // 结束迭代器
    myList.erase(start, end); // 删除所有元素
    std::cout << "List size after erase: " << myList.size() << std::endl;
    // 输出:List size after erase: 0
    return 0;
}


585a60665ce044d8807b2656570aa6cc.png

3.4 clear()函数

1、clear()

功能:清空list容器,删除所有元素。

参数:无参数。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    myList.clear(); // 清空list
    std::cout << "List size after clear: " << myList.size() << std::endl;
    // 输出:List size after clear: 0
    return 0;
}


84b09da7b51442c7a3ba02326a266a10.png

3.5 remove()函数

1、void remove( const TYPE &val );

功能:从list容器中删除所有与指定值 val 相等的元素。

参数:val - 要删除的元素的值。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    myList.push_back(20);
    myList.remove(20); // 删除所有值为20的元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 30
    return 0;
}


3a8c5b90a4ca4a469db17b4660939fd5.png

3.6 unique()函数

1、unique()

功能:从list容器中删除所有连续重复的元素,只保留一个副本。

参数:无参数。

返回值:无返回值。

示例代码:

#include <list>
#include <iostream>
int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(20);
    myList.push_back(30);
    myList.push_back(30);
    myList.push_back(30);
    myList.unique(); // 删除连续重复的元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 20 30
    return 0;
}


135d8628a8334a6b97e8ca5ec2d3b962.png


总结


本文介绍了如何使用C++STL中的list容器进行元素的增加和删除。通过使用push_back()和push_front()函数,我们可以向list容器的末尾和开头添加元素;而使用pop_back()和pop_front()函数,可以从list容器的末尾和开头删除元素。list容器的特点是可以高效地在任意位置进行插入和删除操作,适用于需要频繁修改容器的场景。希望本文能够帮助你入门使用list容器,并进一步了解C++STL的强大功能。

相关文章
|
6天前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
28 2
|
9天前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
114 73
|
10天前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
35 3
|
1月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
27天前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
68 1
|
9月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1143 1
|
8月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
8月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
8月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
101 3
|
9月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
308 3

热门文章

最新文章