【C++STL基础入门】list改、查操作

简介: 【C++STL基础入门】list改、查操作

前言


C++标准模板库(STL)是C++语言中非常重要的部分,它提供了一组通用的模板类和函数,用于处理常见的数据结构和算法问题。其中之一是list(链表),它是一种双向链表容器,提供了高效的插入和删除操作。本文将介绍如何使用C++ STL中的list进行改和查操作。

list的改操作:

在list中进行改操作主要包括插入(Insert)、删除(Erase)和替换(Replace)等操


一、list查操作


1.1 迭代器循环

迭代器循环是一种常见的遍历list的方式。通过使用迭代器,可以逐个访问list中的元素,并进行查找操作。

示例代码:

std::list<int> myList{1, 2, 3, 4, 5};
// 迭代器循环查找元素
for (auto it = myList.begin(); it != myList.end(); ++it) {
    if (*it == 3) {
        // 找到了元素3
        break;
    }
}


13b8414f1d1f41299d85d276ae4da1b6.png

在上面的示例中,我们使用了迭代器遍历list,并通过比较每个元素的值来查找目标元素。当找到目标元素时,我们可以使用break语句退出循环。


1.2 for_each函数

std::for_each()函数是C++ STL提供的一种方便的遍历算法,可以对list中的每个元素应用一个指定的操作。

函数原型:

template<class InputIt, class UnaryFunction>

UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);

参数解释:

first:指向要遍历的list的起始位置的迭代器

last:指向要遍历的list的结束位置的迭代器

f:要应用于每个元素的操作的函数对象

示例代码:

#include <iostream>
#include <list>
#include <algorithm>
void printElement(int element) {
    std::cout << element << " ";
}
int main() {
    std::list<int> myList{1, 2, 3, 4, 5};
    // 使用for_each函数打印每个元素
    std::for_each(myList.begin(), myList.end(), printElement);
    return 0;
}


8fa0b0332b344bd78e3470096ae2a926.png

在上面的示例中,我们定义了一个printElement()函数,它将每个元素打印到标准输出。然后我们使用for_each()函数,将printElement()函数作为参数传递进去,对list中的每个元素进行打印操作。


二、list改操作


2.1 迭代器修改

通过使用迭代器,可以修改list中指定位置的元素的值。

示例代码:

std::list<int> myList{1, 2, 3, 4, 5};
// 通过迭代器修改元素的值
auto it = myList.begin();
++it;  // 移动到第二个元素
*it = 10;  // 修改为10


275612f3894140e5b8e464dda4e06dc4.png

在上面的示例中,我们通过迭代器定位到list中的第二个元素,然后将其值修改为10。


2.2 assign函数

1、assign(count, value)

函数原型:

void assign(size_type count, const T& value);


参数解释:

count:新元素的个数

value:新元素的值

示例代码:

std::list<int> myList;
myList.assign(5, 10);  // 将5个值为10的元素赋值给myList


a35e2847060140518ab32fa2dd6e2200.png

2、assign(first, last)

函数原型:

template <class InputIt>
void assign(InputIt first, InputIt last);


参数解释:

first:指向新元素范围的起始位置的迭代器

last:指向新元素范围的结束位置的迭代器

示例代码:

std::list<int> myList;
std::vector<int> newElements{1, 2, 3, 4, 5};
myList.assign(newElements.begin(), newElements.end());  // 将newElements范围内的元素赋值给myList


ee7bf584af8a47cf9d9230297ee9e7a3.png

3、assign(std::initializer_list)

函数原型:

void assign(std::initializer_list<T> ilist);


参数解释:

ilist:初始化列表,包含了要赋值给list的元素

示例代码:

std::list<int> myList;
myList.assign({1, 2, 3, 4, 5});  // 将初始化列表中的元素赋值给myList


c55d178b25414dccae31af70c01372e3.png

这些重载函数使得使用assign函数更加灵活,可以根据不同的需求选择适合的方式来将新的元素范围赋值给list。


2.3 =运算符

当使用=运算符赋值一个list时,会创建一个副本,使得目标list与源list包含相同的元素。废话不多说,上示例代码:

#include <iostream>
#include <list>
int main() {
  std::list<int> sourceList{1, 2, 3, 4, 5};
  std::list<int> targetList;
  targetList = sourceList;  // 使用=运算符赋值
  // 打印目标list的元素
  for (const auto& element : targetList) {
    std::cout << element << " ";
  }
  std::cout << std::endl;
  return 0;
}


afc7cdbac9b649e0ac0e59b0ba73972a.png


输出:

1 2 3 4 5


在上面的示例中,我们先创建了一个源list sourceList,其中包含了一些整数。然后,我们创建了一个空list targetList。接下来,使用=运算符将源list赋值给目标list。最后,通过遍历目标list中的元素,我们打印出了目标list的元素,验证了赋值操作的正确性。


总结


本文介绍了在C++ STL中使用list进行改和查操作的基本方法。通过插入、删除和替换操作,可以对list的内容进行修改。而通过顺序查找、二分查找和预定义函数等方法,可以从list中查找指定的元素。熟练掌握这些操作可以在实际开发中提高程序的效率和灵活性。建议读者通过进一步学习和练习,深入了解和掌握C++ STL中list的更多特性和用法。

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