• 【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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

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

    1.2 for_each函数

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

    函数原型:

    template
    UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);
    参数解释:

    first:指向要遍历的list的起始位置的迭代器
    last:指向要遍历的list的结束位置的迭代器
    f:要应用于每个元素的操作的函数对象
    示例代码:

    #include 
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    在上面的示例中,我们定义了一个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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

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

    2.2 assign函数

    1、assign(count, value)
    函数原型:

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

    参数解释:

    count:新元素的个数
    value:新元素的值
    示例代码:

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

    在这里插入图片描述

    2、assign(first, last)
    函数原型:

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

    参数解释:

    first:指向新元素范围的起始位置的迭代器
    last:指向新元素范围的结束位置的迭代器
    示例代码:

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

    在这里插入图片描述

    3、assign(std::initializer_list)
    函数原型:

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

    参数解释:

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

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

    在这里插入图片描述

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

    2.3 =运算符

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

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    输出:

    1 2 3 4 5
    
    • 1

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


    总结

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

  • 相关阅读:
    07.微服务spring cloud alibaba nacos
    Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
    简述什么是迭代器(Iterator)?
    cephfs的形式使用ceph,大致思路
    VUE 笔记 202211
    C++ day3
    苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单
    mysql查询 limit 1000,10 和limit 10 一样快吗?
    PaddleMIX学习笔记(1)
    Elasticsearch实战(五):Springboot实现Elasticsearch电商平台日志埋点与搜索热词
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/133092376