一、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
微信掃一掃
支付寶掃一掃