【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的强大功能。

相关文章
|
7天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
15 1
|
20天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
35 7
|
20天前
|
Java 机器人 程序员
从入门到精通:五种 List 遍历方法对比与实战指南
小米是一位热爱分享技术的程序员,本文详细介绍了 Java 中遍历 List 的五种方式:经典 for 循环、增强 for 循环、Iterator 和 ListIterator、Stream API 以及 forEach 方法。每种方式都有其适用场景和优缺点,例如 for 循环适合频繁访问索引,增强 for 循环和 forEach 方法代码简洁,Stream API 适合大数据量操作,ListIterator 支持双向遍历。文章通过生动的小故事和代码示例,帮助读者更好地理解和选择合适的遍历方式。
45 2
|
28天前
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
20 4
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
66 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
81 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
2月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
62 0
|
23天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
31 0
|
3月前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
24 1