C++ List详解

一、C List源码

C++标准库中的List是一个双向链表容器,它允许快速插入和删除元素,但随机访问元素的效率略低于vector。下面是List的基本定义:

#include <list>

using namespace std;

list<int> myList;

这里创建了一个名为myList的List对象,它存储的是整型类型。注意,一旦在程序中创建了List对象,我们就可以使用它的很多方法了。

由于List的实现是基于双向链表的,因此它的底层实现需要使用大量的指针。下面是标准C++库中List实现中的核心代码:

template <typename T>
struct _List_node
{
    _List_node* _Prev;
    _List_node* _Next;
    T _Value;

    _List_node(const T& _Val = T())
        : _Prev(nullptr), _Next(nullptr), _Value(_Val)
    {}
};

template <typename T>
class list
{
public:
    // ...
private:
    _List_node<T>* _Head;
    _List_node<T>* _Tail;
    size_t _Size;
}

二、C List用法

List的用法与vector和deque非常相似。我们可以使用push_front和push_back方法在List的头部和尾部插入元素,可以使用pop_front和pop_back方法删除元素。另外,我们可以使用迭代器来遍历List中存储的元素,或者使用size方法来获取List中元素的数量。

下面是一组List的基本用法示例:

// 创建一个List对象
list<int> myList;

// 在List尾部插入若干元素
for (int i = 0; i < 5; ++i)
    myList.push_back(i);

// 在List头部插入若干元素
for (int i = 0; i < 5; ++i)
    myList.push_front(i);

// 遍历List中的所有元素
for (auto iter = myList.begin(); iter != myList.end(); ++iter)
    cout << *iter << endl;

// 删除头部元素
myList.pop_front();

// 删除尾部元素
myList.pop_back();

// 获取List中元素的数量
cout << myList.size() << endl;

三、C List容器

List属于C++标准库的容器之一,容器是用于存储数据的数据结构。List是一个双向链表,与vector和deque相比,它具有插入和删除元素更快的优势,但随机访问元素的效率略低。

四、C语言 List

对于C语言开发人员,也可以使用List。List对应的头文件是<glib.h>,下面是一个简单的C语言List程序示例:

#include <stdio.h>
#include <glib.h>

int main()
{
    GList* list = NULL;
    for (int i = 0; i < 5; ++i)
        list = g_list_append(list, GINT_TO_POINTER(i));

    for (GList* iter = list; iter; iter = iter->next)
        printf("%d\n", GPOINTER_TO_INT(iter->data));

    return 0;
}

五、C List定义

在C++中,我们可以使用template<typename T> class list来定义一个List,其中T是指List存储的元素类型。我们可以根据需要在List中存储不同类型的元素,例如整型、字符型、字符串等。

六、查找List中最大值C语言

下面是一个在C语言中查找List中最大值的程序示例:

#include <stdio.h>
#include <limits.h>
#include <glib.h>

int main()
{
    GList* list = NULL;
    for (int i = 0; i < 5; ++i)
        list = g_list_append(list, GINT_TO_POINTER(i));

    int max = INT_MIN;
    for (GList* iter = list; iter; iter = iter->next)
    {
        int val = GPOINTER_TO_INT(iter->data);
        if (val > max)
            max = val;
    }

    printf("Max value: %d\n", max);
    return 0;
}

七、C List逆序

List的逆序操作可以使用std::reverse或std::reverse_copy方法实现,下面是一个示例程序:

#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

int main()
{
    list<int> myList;
    for (int i = 0; i < 5; ++i)
        myList.push_back(i);

    // 使用std::reverse逆序
    reverse(myList.begin(), myList.end());

    // 使用List自带的reverse方法逆序
    myList.reverse();

    // 输出逆序后的元素
    for (auto iter = myList.begin(); iter != myList.end(); ++iter)
        cout << *iter << " ";
    cout << endl;

    return 0;
}

八、CListCtrl设置选中行

MFC中的CListCtrl可以使用SetItemState和GetItemState分别设置和获取ListCtrl中单元格的状态,下面是一个示例程序:

BOOL CMyDlg::OnInitDialog()
{
    // 初始化ListCtrl
    m_listCtrl.InsertColumn(0, _T("Name"));
    m_listCtrl.InsertColumn(1, _T("Age"));

    // 添加若干项
    m_listCtrl.InsertItem(0, _T("Tom"));
    m_listCtrl.SetItemText(0, 1, _T("20"));

    m_listCtrl.InsertItem(1, _T("Jerry"));
    m_listCtrl.SetItemText(1, 1, _T("22"));

    // 设置第一项为选中状态
    m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);

    return TRUE;
}

九、C Listen

C++标准库中的List可以存储不同类型的元素,因此我们可以创建一个包含多种类型元素的List,例如整型、字符型、字符串等。下面是一个包含不同类型元素的List程序示例:

#include <iostream>
#include <list>

using namespace std;

int main()
{
    list<auto> myList;
    myList.push_back(1);
    myList.push_back(2.3);
    myList.push_back('a');
    myList.push_back("hello");

    // 输出List中所有元素
    for (auto iter = myList.begin(); iter != myList.end(); ++iter)
    {
        cout << *iter << " ";
    }
    cout << endl;

    return 0;
}

十、C ListBox拖拽选取

MFC中的CListBox可以使用LB_SETCURSEL、LB_SETSEL、LB_SELITEMRANGE等方法实现ListBox的拖拽选取功能,下面是一个示例程序:

BOOL CMyDlg::OnInitDialog()
{
    // 初始化ListBox
    m_listBox.AddString(_T("Item 1"));
    m_listBox.AddString(_T("Item 2"));
    m_listBox.AddString(_T("Item 3"));
    m_listBox.AddString(_T("Item 4"));
    m_listBox.AddString(_T("Item 5"));

    return TRUE;
}

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // 鼠标左键按下
    m_bLButtonDown = true;
    m_ptLButtonDown = point;
}

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    // 鼠标移动
    if (m_bLButtonDown)
    {
        // 根据两点坐标计算出矩形区域
        CRect rect(m_ptLButtonDown, point);
        rect.NormalizeRect();

        // 选取矩形区域内所有的ListBox项
        int start = m_listBox.ItemFromPoint(rect.TopLeft());
        if (start == LB_ERR)
            start = 0;

        int end = m_listBox.ItemFromPoint(rect.BottomRight());
        if (end == LB_ERR)
            end = start;

        m_listBox.SelItemRange(true, start, end);
    }
}

void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    // 鼠标左键弹起
    m_bLButtonDown = false;
    m_listBox.SetCurSel(0);
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 17:12
下一篇 2024-12-12 17:12

相关推荐

  • Tensor to List的使用

    Tensor to List是TensorFlow框架提供的一个非常有用的函数,在很多的深度学习模型中都会用到。它的主要功能是将TensorFlow中的张量(Tensor)转换为P…

    编程 2025-04-29
  • 如何使用Python将输出值赋值给List

    对标题进行精确、简明的解答:本文将从多个方面详细介绍Python如何将输出的值赋值给List。我们将分步骤进行探讨,以便读者更好地理解。 一、变量类型 在介绍如何将输出的值赋值给L…

    编程 2025-04-28
  • Python List查找用法介绍

    在Python中,list是最常用的数据结构之一。在很多场景中,我们需要对list进行查找、筛选等操作。本文将从多个方面对Python List的查找方法进行详细的阐述,包括基本查…

    编程 2025-04-28
  • Python DataFrame转List用法介绍

    Python中常用的数据结构之一为DataFrame,但有时需要针对特定需求将DataFrame转为List。本文从多个方面针对Python DataFrame转List详细介绍。…

    编程 2025-04-27
  • Python中list和tuple的用法及区别

    Python中list和tuple都是常用的数据结构,在开发中用途广泛。本文将从使用方法、特点、存储方式、可变性以及适用场景等多个方面对这两种数据结构做详细的阐述。 一、list和…

    编程 2025-04-27
  • 使用Flutter开发ToDo List App

    本文将会介绍如何使用Flutter开发一个实用的ToDo List App。ToDo List,即待办事项清单,是一种记录人们未处理工作和待办事项的方式。随着日常生活的快节奏,如此…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论