一、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-tw/n/249714.html