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/zh-hant/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

發表回復

登錄後才能評論