VC++中listlist的使用方法总结

合集下载

VC++中list的使用方法总结 .

VC++中list的使用方法总结 .

这几天在做图像处理方面的研究,其中有一部分是关于图像分割方面的,图像目标在分割出来之后要做进一步的处理,因此有必要将目标图像的信息保存在一个变量里面,一开始想到的是数组,但是马上就发现使用数组的缺点:数组长度固定,动态分配内存很容易导致错误发生。

最重要的一点是我要保存目标图像的每一点的坐标值,使用数组就有点无能为力了。

因此到百度、Google大神上面找思路,终于被我发现在c++的标准库里面还有这么一个模板类:list,下面就是对找到的资料的汇总和加工。

vc6自带的msdn帮助文档的解释以下是引自msdn帮助文档(中文是我自己翻译的,错误之处请包涵。

):The template class describes an object that controls a varying-length sequence of elements of type T. The sequence is stored as a bidirectional linked list of elements, each containing a member of type T.本模板类描述了一个对象,这个对象是类型为T的可变长度的序列元素。

这个序列采用双向链表的方式存储每一个元素,其中每一个元素的数据流行都是T。

The object allocates and frees storage for the sequence it controls through a protected object named allocator, of class A. Such an allocator object must have the same external interface as an object of template class allocator. Note that allocatoris not copied when the object is assigned.对序列对象的分配和释放操作通过一个受保护的对象allocator进行。

c语言中list的实现方式

c语言中list的实现方式

c语言中list的实现方式
在C语言中,实现列表(list)的方式有多种。

其中包括使用
数组、使用指针和动态内存分配以及使用结构体等方法。

首先,可以使用数组来实现列表。

这种方法需要预先定义数组
的大小,然后在数组中存储列表元素。

使用数组实现列表的好处是
访问元素速度快,但缺点是数组大小固定,不够灵活。

其次,可以使用指针和动态内存分配来实现列表。

这种方法可
以在运行时动态分配内存,使列表的大小可以根据需要进行调整。

使用指针和动态内存分配实现列表的好处是灵活性高,但需要手动
管理内存,存在内存泄漏的风险。

另外,还可以使用结构体来实现列表。

通过定义一个包含数据
和指向下一个节点的指针的结构体,可以实现链表(linked list)。

链表可以是单向的,也可以是双向的,具有灵活的插入和删除操作,但访问元素的速度相对较慢。

除了上述方法,还可以结合使用数组和指针,或者使用其他数
据结构来实现列表,如栈、队列等。

每种实现方式都有其优缺点,
选择合适的实现方式取决于具体的需求和应用场景。

总的来说,在C语言中,实现列表的方式有多种多样,开发人员可以根据实际情况选择最适合的方式来实现列表。

c++ list集合使用方法

c++ list集合使用方法

c++ list集合使用方法List是一种STL容器,它是由一个双向链表实现的。

它允许在任意位置进行快速插入和删除元素,并且允许通过迭代器来访问和修改元素。

List的元素可重复,且是线性有序的。

在C++中,List是由头文件<list>定义的。

1. 创建List对象创建List对象是非常简单的,只需要使用List<类型>对象名称;即可。

例如:List<int> mylist; // 创建一个名为mylist的List对象在上例中,我们创建了一个空的List对象,该List对象的元素类型为int。

2. 插入元素像许多其他容器一样,List也提供了几种方式向其添加元素。

我们将以下方法描述如下:(i) push_back(value) - 在List的末尾添加一个元素 value.例如:List<int> mylist; // 创建一个名为mylist的List对象mylist.push_back(10); // 在List的末尾添加元素10mylist.push_back(20); // 在List的末尾添加元素20mylist.push_front(30); // 在List的开头添加元素30在上例中,我们首先将元素10添加到List的末尾,然后将元素20添加到List的末尾。

最后,我们添加了第三个元素30到List的开头。

3. 访问元素可以使用迭代器来访问List中的元素。

迭代器是指向List中一个特定元素的指针,类似于指针。

使用*运算符指向迭代器的内容(即对应的元素),可以用->运算符访问指向元素的成员。

for (auto it = mylist.begin(); it != mylist.end(); ++it){std::cout << *it << '\n'; // 访问当前迭代器指向的元素}上述代码将遍历List并输出所有元素的值,即:30、10和20。

c语言中list的用法

c语言中list的用法

C语言中list的用法1.简介在C语言中,l is t是一种常用的数据结构,用于存储和管理多个元素。

它类似于数组,但具有更强大的灵活性和功能。

本文将介绍C语言中l i st的使用方法,包括创建、添加、删除和遍历等操作。

2.创建lis t要使用l is t,首先需要定义一个结构体来表示l is t的节点,节点中包含数据元素和指向下一个节点的指针。

然后,使用指向该结构体的指针来表示整个l is t。

以下是创建l is t的基本代码:t y pe de fs tr uc tN ode{i n td at a;s t ru ct No de*n ex t;}N od e;t y pe de fs tr uc t{N o de*h ea d;}L is t;3.添加元素要向li st中添加元素,可以使用以下代码:v o id ad dE le me nt(Li s t*li st,i nt ne wDa t a){N o de*n ew No de=(Nod e*)ma ll oc(s iz eof(No de));n e wN od e->d at a=new D at a;n e wN od e->n ex t=NUL L;i f(l is t->h ea d==NU L L){l i st->he ad=n ew Nod e;}e ls e{N o de*c ur re nt No de=l is t->h ea d;w h il e(cu rr en tN ode->n ex t!=N UL L){c u rr en tN od e=cu rre n tN od e->n ex t;}c u rr en tN od e->n ext=ne wN od e;}}4.删除元素要从li st中删除元素,可以使用以下代码:v o id re mo ve El em ent(Li st*l is t,in tta r ge t){ N o de*c ur re nt No de=l is t->h ea d;N o de*p re vN od e=NUL L;w h il e(cu rr en tN ode!=N UL L){i f(c ur re nt No de->d a ta==ta rg et){i f(p re vN od e==N ULL){l i st->he ad=c ur ren t No de->ne xt;}e ls e{p r ev No de->ne xt=cu r re nt No de->ne xt;}f r ee(c ur re nt No de);b r ea k;}p r ev No de=c ur re ntN o de;c u rr en tN od e=cu rre n tN od e->n ex t;}}5.遍历lis t要遍历l is t中的所有元素,可以使用以下代码:v o id tr av er se Li st(L is t*li st){N o de*c ur re nt No de=l is t->h ea d;w h il e(cu rr en tN ode!=N UL L){p r in tf("%d",cu rre n tN od e->d at a);c u rr en tN od e=cu rre n tN od e->n ex t;}}6.示例下面是一个使用l ist的示例:#i nc lu de<s td io.h>#i nc lu de<s td li b.h>t y pe de fs tr uc tN ode{i n td at a;s t ru ct No de*n ex t;}N od e;t y pe de fs tr uc t{N o de*h ea d;}L is t;v o id ad dE le me nt(Li s t*li st,i nt ne wDa t a){N o de*n ew No de=(Nod e*)ma ll oc(s iz eof(No de)); n e wN od e->d at a=new D at a;n e wN od e->n ex t=NUL L;i f(l is t->h ea d==NU L L){l i st->he ad=n ew Nod e;}e ls e{N o de*c ur re nt No de=l is t->h ea d;w h il e(cu rr en tN ode->n ex t!=N UL L){c u rr en tN od e=cu rre n tN od e->n ex t;}c u rr en tN od e->n ext=ne wN od e;}}v o id re mo ve El em ent(Li st*l is t,in tta r ge t){N o de*c ur re nt No de=l is t->h ea d;N o de*p re vN od e=NUL L;w h il e(cu rr en tN ode!=N UL L){i f(c ur re nt No de->d a ta==ta rg et){i f(p re vN od e==N ULL){l i st->he ad=c ur ren t No de->ne xt;}e ls e{p r ev No de->ne xt=cu r re nt No de->ne xt; }f r ee(c ur re nt No de);b r ea k;}p r ev No de=c ur re ntN o de;c u rr en tN od e=cu rre n tN od e->n ex t;}}v o id tr av er se Li st(L is t*li st){N o de*c ur re nt No de=l is t->h ea d;w h il e(cu rr en tN ode!=N UL L){p r in tf("%d",cu rre n tN od e->d at a);c u rr en tN od e=cu rre n tN od e->n ex t;}}i n tm ai n(){L i st my Li st;m y Li st.h ea d=NU LL;a d dE le me nt(&my Lis t,5);a d dE le me nt(&my Lis t,10);a d dE le me nt(&my Lis t,15);r e mo ve El em en t(&my L is t,10);t r av er se Li st(&myL i st);r e tu rn0;}7.总结使用li st可以轻松地管理多个元素,实现灵活的数据存储和操作。

VS(C#)中LIST用法

VS(C#)中LIST用法
E.g.: mList.Remove("Hunter"); 2、 List. RemoveAt(int index); 删除下标为 index 的元素
E.g.: mList.RemoveAt(0); 3、 List. RemoveRange(int index, int count);
从下标 index 开始,删除 count 个元素 E.g.: mList.RemoveRange(3, 2);
List 清空:List. Clear () E.g.: mList.Clear();
获得 List 中元素数目: List. Count () 返回 int 值 E.g.: int count = mList.Count();
Console.WriteLine("The num of elements in the list: " +count);
public T Find(Predicate<T> match); Predicate 是对方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回 t rue。当前 List 的元素被逐个传递给 Predicate 委托,并在 List 中向前移动,从第一个元 素开始,到最后一个元素结束。当找到匹配项时处理即停止。
泛型的好处: 它为使用 c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行 对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。
性能注意事项: 在决定使用 IList<T> 还是使用 ArrayList 类(两者具有类似的功能)时,记住 IList <T> 类在大多数情况下执行得更好并且是类型安全的。 如果对 IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果 对类型 T 使用值类型,则需要考虑实现和装箱问题。 “添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是 值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转 换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱 和取消装箱的影响非常明显。”

VC中CList用法

VC中CList用法

VC中CList用法(2009-05-22 16:26:32)转载▼分类:C&C++标签:杂谈CList是一个双向链表类。

1、头文件名不可少Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。

2、理解CList的声明和构造方法CList的声明如下:template< class TYPE, class ARG_TYPE >class CList : public CObject由此,我们知道CList是一个模版类,那么他的两个class是什么意思呢?下面看一个例子:CList<CString ,CString&> list;//链表对象1CList<CString,CString> list2;//链表对象2这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型引用,当然也可以是对象,而不是引用。

对象和引用的区别,可以看一下C++基础知识方面的书。

3、使用CList的迭代器迭代器是近年在链表使用中的一个常用技术。

如果大家学过java,就会知道,在java中,会有专门的一个迭代器类,这个迭代器类用来访问Collect中的数据元素。

在mfc中,在CList中,定义了几个迭代器的函数。

他们方便了我们去访问数据元素。

GetHeadPosition Returns the position of the head element of the list. GetTailPosition Returns the position of the tail element of the list.GetNext Gets the next element for iterating.GetPrev Gets the previous element for iterating.以上是四个迭代器函数。

VCMFC之ListCtrl控件使用经验总结(转)

VCMFC之ListCtrl控件使用经验总结(转)

VCMFC之ListCtrl控件使用经验总结(转)以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。

如ListView_InsertColumn--------------------------------------------------------------------------------1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”--------------------------------------------------------------------------------2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件m_list.SetExtendedStyle(dwStyle); //设置扩展风格注:listview的style请查阅msdn/library/default.asp?url=/library/ en-us/wceshellui5/html/wce50lrflistviewstyles.asp--------------------------------------------------------------------------------3. 插入数据m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );int nRow = m_list.InsertItem(0, “11”);//插入行m_list.SetItemText(nRow, 1, “jacky”);//设置数据--------------------------------------------------------------------------------4. 一直选中item选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS--------------------------------------------------------------------------------5. 选中和取消选中一行int nIndex = 0;//选中m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);//取消选中m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);--------------------------------------------------------------------------------6. 得到listctrl中所有行的checkbox的状态m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);CString str;for(int i=0; i<m_list.GetItemCount(); i++){if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i)){str.Format(_T("第%d行的checkbox为选中状态"), i);AfxMessageBox(str);}}--------------------------------------------------------------------------------7. 得到listctrl中所有选中行的序号方法一:CString str;for(int i=0; i<m_list.GetItemCount(); i++){if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) {str.Format(_T("选中了第%d行"), i);AfxMessageBox(str);}}方法二:POSITION pos = m_list.GetFirstSelectedItemPosition();if (pos == NULL)TRACE0("No items were selected!\n");else{while (pos){int nItem = m_list.GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}}--------------------------------------------------------------------------------8. 得到item的信息TCHAR szBuf[1024];LVITEM lvi;lvi.iItem = nItemIndex;lvi.iSubItem = 0;lvi.mask = LVIF_TEXT;lvi.pszText = szBuf;hTextMax = 1024;m_list.GetItem(&lvi);关于得到设置item的状态,还可以参考msdn文章Q173242: Use Masks to Set/Get Item States in CListCtrl/kb/173242/en-us--------------------------------------------------------------------------------9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hTextMax = 256;while(m_list.GetColumn(nColNum, &lvcol)){strColumnName[nColNum] = lvcol.pszText;nColNum++;}--------------------------------------------------------------------------------10. 使listctrl中一项可见,即滚动滚动条m_list.EnsureVisible(i, FALSE);--------------------------------------------------------------------------------11. 得到listctrl列数int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();--------------------------------------------------------------------------------12. 删除所有列方法一:while ( m_list.DeleteColumn (0))因为你删除了第一列后,后面的列会依次向上移动。

c语言list用法

c语言list用法

c语言list用法在C语言中,没有内置的List数据类型,但是可以使用数组来实现类似的功能。

下面是一种用数组实现List的常见方式:1. 定义一个结构体来表示List和相关的元素:ctypedef struct{int capacity; List最大容量int size; List当前元素个数int *data; List元素数组} List;2. 初始化List:cList* initList(int capacity){List *list = (List*)malloc(sizeof(List)); 分配内存list->capacity = capacity; 设置容量list->size = 0; 初始元素个数为0list->data = (int*)malloc(sizeof(int) * capacity); 分配数组内存return list;}3. 添加元素到List的末尾:cvoid add(List *list, int element){if(list->size == list->capacity){List已满,需要扩容list->capacity *= 2;list->data = (int*)realloc(list->data, sizeof(int) * list->capacity);}list->data[list->size++] = element;}4. 获取List指定位置的元素:cint get(List *list, int index){if(index < 0 index >= list->size){printf("Index out of range.\n");return -1; 返回一个错误值}return list->data[index];5. 删除List末尾的元素:cvoid removeLast(List *list){if(list->size > 0){list->size;}}6. 销毁List:cvoid destroyList(List *list){free(list->data); 释放数组内存free(list); 释放List内存}使用示例:cint main(){List *list = initList(5); 初始化容量为5的Listadd(list, 10);add(list, 20);add(list, 30);printf("List[0]: %d\n", get(list, 0)); 输出:List[0]: 10removeLast(list);printf("List[2]: %d\n", get(list, 2)); 输出:Index out of range. List[2]: -1destroyList(list); 销毁Listreturn 0;}这只是一种使用数组实现List的方式,根据实际需求可以进行相应的修改和扩展。

list列表用法

list列表用法

list列表用法在编程中,list是一种常用的数据结构,可以容纳多个元素,并按照它们在列表中的顺序进行排列。

以下是关于list列表用法的介绍:1. 创建列表:使用方括号 [] 来创建一个列表,并在其中添加元素,多个元素之间使用逗号分隔。

例如:[1, 2, 3, 4, 5]。

2. 访问列表元素:通过索引值(从0开始)来访问列表中的元素。

例如,对于列表[1, 2, 3, 4, 5],要访问第一个元素,使用list_name[0]。

3. 列表元素的增加与删除:- 使用append()函数在列表末尾添加元素。

例如,使用list_name.append(6)将6添加到列表的末尾。

- 使用insert()函数在指定位置插入元素。

例如,使用list_name.insert(2, 7)将7插入到索引为2的位置。

- 使用remove()函数删除指定元素。

例如,使用list_name.remove(3)将列表中的第一个3删除。

- 使用del语句删除指定位置的元素。

例如,使用del list_name[0]将列表中的第一个元素删除。

4. 列表的切片:可以使用切片来获取列表的一部分。

通过指定起始索引和结束索引(不包含在切片结果中),可以获得指定范围内的元素。

例如,list_name[1:4]将返回包含索引1到3的元素的切片。

5. 列表的长度和排序:使用len()函数获取列表中元素的个数。

例如,len(list_name)将返回列表中元素的个数。

使用sort()函数对列表进行升序排序。

例如,list_name.sort()将列表元素按照升序重新排列。

6. 列表的遍历:使用for循环遍历列表的每个元素。

例如,for item in list_name: 可以访问列表中的每个元素,其中item是一个用于迭代列表的临时变量。

总结:list列表是一种灵活且功能强大的数据结构,可用于存储和处理各种类型的数据。

通过掌握列表的创建、访问、增加与删除、切片、长度和排序等基本用法,您将能够更好地利用列表来解决编程任务中的问题。

VC中CList几处细节用法

VC中CList几处细节用法

VC中CList几处pos细节用法Clist的用法网上已有很多,且附有简明示例,易学入手。

可是今天在使用时却有基础细节不甚明了,通过代入数据一一试验中的证实,现分享如下。

首先定义CList<class TYPE, class ARG_TYPE> MyListPOSITION pos;接下来主要讨论调用成员函数时,pos的变化:1. TYPE Temp = MyList.GetNext(pos),这个在很多学习资料中有介绍,返回当前pos的值,pos位置后移一位,相当于a++,先运算后自增。

2. TYPE Temp = MyList.GetPtev(pos),这和1中类似;但是当pos指向首位置,仍旧返回当前位置值,而此时pos的指向会发生错误。

3. MyList. InsertBefore (pos,TYPE)MyList. InsertAfter (pos,TYPE)这两个成员函数调用时,pos的变化我们通过一个实例来说明:列表:A→B→C→D→E→F→G→H,当pos指向D时InsertBefore(pos,X),此时列表变为A→B→C→X→D→E→F→G→HPos的指向位置依旧是D。

InsertAfter依然。

4. MyList. RemoveAt (pos)依旧以3中链表为例:A→B→C→D→E→F→G→H当pos指向D时RemoveAt (pos),此时pos依旧指向D,可是D已经被移除列表,pos为何依旧指向D呢?!我们通过调用几个成员函数来揭示其中的位置指向关系。

假设此时pos指向D位置MyList. RemoveAt (pos)TYPE Temp = MyList. GetAt (pos) //返回Temp值为D以下①②是并列关系,承接以上代码①Temp = MyList. GetNext (pos) //pos为NULL②Temp = MyList. GetPrevt (pos) //返回Temp值为CTemp = MyList. GetNext (pos) //返回Temp值为E由此我们便可以得出结论,CList 列表是与双链接列表行为相似的,可以用下图表示:5. 最后再说下自己编程时遇见的一个小问题:POSITION pos=MyList.Find((TYPE) Temp);Find函数查找Temp时会对TYPE类型进行比较,当TEPY是结构体或者类时,就可能出现错误,需要对运算符“==”重构TYPE operator ==(TYPE &)const当然TYPE是普通数据结构(int double string等)时不会出现此问题。

VC++ 列表控件(CList) 使用方法 (2)

VC++ 列表控件(CList) 使用方法 (2)

VC++ 列表控件(CList) 使用方法(2)列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。

MFC中使用CListCtrl类来封装列表控件的各种操作。

通过调用BOOL Create( DWORD dwStyle, const RECT&rect, CWnd* pParentWnd, UINT nI D );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。

LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点LVS_SINGLESEL 同时只能选中列表中一项首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);通过调用intInsertItem( intnItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。

除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。

通过调用intInsertColumn( intnCol, LPCTSTR lpszColumnHeading, intnFormat , intnWidth, i ntnSubItem);可以插入列。

C__List用法详解

C__List用法详解
List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数 组实现 IList<T> 泛型接口。
泛型的好处: 它为使用 c#语言编写面向对象程序增加了极大的效力和灵活
性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换, 所以性能得到提高。
性能注意事项:
在决定使用 IList<T> 还是使用 ArrayList 类(两者具有类似的功能)时, 记住 IList<T> 类在大多数情况下执行得更好并且是类型安全的。
须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。”
1、 List 的基础、常用方法:
声明:
1、List<T> mList = new List<T>(); T为列表中元素类型,现在以string类型作为例子
E.g.: List<string> mList = new List<string>();
2、 List<T> testList =new List<T> (IEnumerable<T> collection); 以一个集合作为参数创建List
E.g.:
string[] temArr = { "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" }; List<string> testList = new List<string>(temArr);

VCMFC之ListCtrl控件使用经验总结

VCMFC之ListCtrl控件使用经验总结

VCMFC之ListCtrl控件使用经验总结本文将从创建ListCtrl控件、数据的插入、删除和修改、列表项的选择和排序等方面,总结一些经验和注意事项。

一、创建ListCtrl控件创建ListCtrl控件的方法有很多,下面介绍两种常用的方法。

2. 动态创建ListCtrl控件:可以通过CListCtrl类的Create函数来动态创建ListCtrl控件。

例如:```cppCListCtrl m_listCtrl;m_listCtrl.Create(WS_CHILD , WS_VISIBLE , LVS_REPORT, CRect(0, 0, 500, 300), this, IDC_LIST_CTRL);```此外,还可以通过控件向导创建ListCtrl控件,控件向导在创建ListCtrl控件时会生成相关的代码。

二、数据的插入、删除和修改1.插入数据:可以使用InsertItem函数向ListCtrl控件中插入新的项。

例如:```cppm_listCtrl.InsertItem(0, _T("Item 1"));2.删除数据:可以使用DeleteItem函数删除ListCtrl控件中的其中一项。

例如:```cppm_listCtrl.DeleteItem(0);```3.修改数据:可以通过SetItemText函数修改ListCtrl控件中其中一项的文字。

例如:```cppm_listCtrl.SetItemText(0, 1, _T("Modified Item"));```三、列表项的选择和排序1.列表项的选择:可以使用GetNextItem函数和SetItemState函数来获取和设置ListCtrl控件中的选中项。

例如:```cppint nItem = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);m_listCtrl.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);2.列表项的排序:可以使用SortItems函数对ListCtrl控件中的数据进行排序。

VC中使用ListCtrl和LVITEM 经验总结

VC中使用ListCtrl和LVITEM 经验总结

VC中使用ListCtrl和LVITEM 经验总结(转)默认分类2009-10-04 22:22 阅读78 评论1字号:大中小VC中使用ListCtrl和LVITEM 经验总结(博客搬家)2008-08-04 12:19:54此文转至:/BlogView.asp?logID=961VC中使用ListCtrl和LVITEM 经验总结ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。

先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。

其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么叫比较COOL :)条款一:设置ListCtrl的风格在CSDN上常常看到有人问怎么设置风格的,他们ListCtrl的样子是一个列表,有横条和竖条分界线,然后选中一行,要整一行都选中,而不是只有某一列被选中,等等,这里给一个比较全面的设置方法。

//获得原有风格DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);dwStyle &= ~(LVS_TYPEMASK);dwStyle &= ~(LVS_EDITLABELS);//设置新风格SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);//设置扩展风格DWORD styles =LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES; ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles,styles );其中LVS_EX_FULLROWSELECT就是前面说得整行选中LVS_EX_GRIDLINES网格线(只适用与report风格的listctrl)LVS_EX_CHECKBOXES前面加个checkboxpListCtrl->SetExtendedStyle( m_listctrl.GetExtendedStyle()|LVS_EX_SUBITEMIMAGES);这也是一个很重要的属性,这样的话,可以在列表中加ICON,记得windows的任务管理器吗,你想做得那样,这个属性也要加哦,这个我以后会讲的~条款二:加入列头这是一个比较实质的东西,给列表框分列,然后加上列头代码说话,来了TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};LV_COLUMN lvcolumn;CRect rect;m_listctrl.GetWindowRect(&rect);for(int i=0;i<2;i++){lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT| LVCF_WIDTH | LVCF_ORDER;lvcolumn.fmt = LVCFMT_LEFT;lvcolumn.pszText = rgtsz[i];lvcolumn.iSubItem = i;lvcolumn.iOrder = i;if(i==0){lvcolumn.cx = rect.Width()*3/5 ;}elselvcolumn.cx = rect.Width()*2/5;m_listctrl.InsertColumn(i, &lvcolumn);}这是插入两列的做法,你要插入20列??随便你,依样画葫芦~~lvcolumn.mask 中那个mask可以有各种属性,具体去看msdn吧,条款三:把记录,插入列表框中int nIndex = m_listctrl.GetItemCount();LV_ITEM lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT;lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;if (m_listctrl.InsertItem(&lvitemAdd) != -1){LV_ITEM lvitem = {0};lvitem.mask = LVIF_TEXT;lvitem.iItem = nIndex ;lvitem.iSubItem = 1;lvitem.pszText =_T("毛毛2");m_listctrl.SetItem(&lvitem);}nIndex 是当前的行数,然后把新的一行,插在最下面,条款四:给列表中插入图标在report格式中,也能插入图标继续代码说话m_image是个CImageList对象m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);m_listctrl.SetImageList(&m_image,LVSIL_SMALL);然后调用CImageList的成员函数int CImageList::Add( HICON hIcon ); 把ICON插入到imagelist,然后在插入记录的时候lvitemAdd.mask = LVIF_TEXT;-》lvitemAdd.mask =LVIF_TEXT|LVIF_IMAGE然后添加一个lvitemAdd.iImage = n;这个n是imagelist中的序号,表示是具体的哪一个图标,list么,呵呵条款五:插入记录时使用额外的信息,lParam 的使用有时候,你想对于某一行,加入一些额外的信息,那么就可以使用这个lParammsdn是这么描述的Specifies the 32-bit value of the item我上次是为了在某一行加入一个信息,窗口句柄,然后是这么加的,int nIndex = m_listctrl.GetItemCount();LV_ITEM lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;lvitemAdd.iImage = n;lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)if (m_listctrl.InsertItem(&lvitemAdd) != -1){LV_ITEM lvitem = {0};lvitem.mask = LVIF_TEXT;lvitem.iItem = nIndex ;lvitem.iSubItem = 1;lvitem.pszText =_T("毛毛2");m_listctrl.SetItem(&lvitem);}ok,这是一个比较全的例子的,又插ICON,又使用PARAM的条款六:点击列表框,获取选中行信息响应NM_CLICK消息,如果你有MSDN,可以看到,有专门关于listview的NM_CLICK的介绍void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereint nItem = -1;LPNMITEMACTIVA TE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;if(lpNMItemActivate != NULL){nItem = lpNMItemActivate->iItem;}}现在nItem就是点击选中那行的index了,有了index,获取那行的信息还难吗?懒汉说:难,因为你还没讲,晕,那就继续说条款七:根据行的index,获取该行的信息直接上代码吧LV_ITEM lvitem = {0};lvitem.iItem = nIndex;lvitem.iSubItem = 0;lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;m_listctrl.GetItem(&lvitem)这样,就把nindex,第一列的信息取出来了,包括刚才我们加入的ICON,和那个额外信息(窗口句柄),比如我要获取窗口句柄,就可以hwnd = (HWND)lvitem.lParam;mask 用来指明你想获取那些信息具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem条款八:用程序选中某一行,使之选中选中之m_listctrl.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED); 不选中,取消选中之m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);条款九:获取当前所有选中的行(多选)这个,俺就比较懒了,抄msdn的代码吧,反正很简单Example// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);ASSERT(pListCtrl != NULL);POSITION pos = pList->GetFirstSelectedItemPosition();if (pos == NULL)TRACE0("No items were selected!\n");else{while (pos){int nItem = pList->GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}}条款十:删除条款九中选中的行这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话。

vc list box 多选用法

vc list box 多选用法

vc list box 多选用法
在VC++中,ListBox是一种常用的控件,它允许用户从一个项目列表中选择一个或多个项目。

要实现ListBox的多选功能,可以按照以下步骤进行操作:
1. 设置ListBox的样式:
在设计界面或者代码中,设置ListBox的样式为
LBS_EXTENDEDSEL或者LBS_MULTIPLESEL。

LBS_EXTENDEDSEL样式允许用户通过鼠标拖动或者使用Shift键进行连续选择,
LBS_MULTIPLESEL样式允许用户通过Ctrl键进行不连续选择。

2. 处理选择事件:
当用户进行选择操作时,可以通过处理ListBox的消息来获取用户选择的项目。

可以使用LB_GETSELITEMS消息来获取用户选择的项目索引,然后进一步处理选择的项目。

3. 处理其他相关消息:
在多选的情况下,还可以处理LB_SELITEMRANGE消息来获取
用户选择的项目范围,以及LB_SETSEL消息来设置ListBox中的项
目选择状态。

4. 更新数据:
根据用户的选择,可以相应地更新数据或者执行其他操作。

可以在ListBox选择改变时触发相应的事件或者调用相应的函数来
处理选择的项目。

总之,要实现ListBox的多选功能,需要设置ListBox的样式,处理选择事件,处理其他相关消息以及更新数据。

通过这些步骤,
就可以实现ListBox的多选用法。

希望这些信息能够帮助到你。

c++list用法

c++list用法

c++list用法C++ list 是 C++ 标准模板库(Standard Template Library,STL)的一种序列式容器。

list与 vector 不同之处在于,vector 是经常用来模拟动态数组的一种线性容器,其元素的插入和删除速率只取决于数据的尾部,与数据的中间位置无关,而 list 以双向链表的形式存储,允许快速地在 list 的任意位置插入或删除元素。

list 是一个头文件,其主要功能有:- 将新元素插入到 list 中。

- 从 list 中移除元素。

- 将 list 中的一个元素移动到另一个位置。

- 将 list 中的一个元素复制到另一个位置。

- 将元素排序。

- 在 list 中定位一个元素。

list 通常拥有以下构造函数,大致如下:- list():默认构造函数。

- list(size_t n):创建元素数量为 n 的 list。

- list(size_t n, const value_type &val):创建元素数量为 n 的 list,且元素全部初始化为 val。

- list(InputIterator first, InputIterator last):创建 list,用 first 和last 标识输入区间,然后把输入区间包含的元素拷贝到 list 中。

list 允许天然的双向遍历。

可以在运行时定位现有元素的位置,而且快速地加入或移除它。

list 在频繁的元素的插入和删除,不如 vector 查询元素的速度快,但是插入和删除的效率更高,而且 list 不会发生内存重分配。

如果是需要频繁的插入与删除的情形,list 是最佳的选择。

与其他 STL 容器一样,list 具有统一的使用方法,用户只需要理解顶层容器的功能,就可以使用所有统一界面容器,而 list 也不例外,只要用户掌握了 list 的构造函数、push_back、pop_back、erase方法等操作,就可以灵活使用 list 容器。

VC中CList用法及其成员的使用

VC中CList用法及其成员的使用

VC中CList用法及其成员的使用初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的Collect类的使用产生了惧怕。

以下,就个人经历而言,告诉大家如何使用CList。

CList是一个双向链表类。

1、头文件名不可少Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。

2、理解CList的声明和构造方法CList的声明如下:template< class TYPE, class ARG_TYPE >class CList : public CObject由此,我们知道CList是一个模版类,那么他的两个class是什么意思呢?下面看一个例子:CList<CString ,CString&> list;//链表对象1CList<CString,CString> list2;//链表对象2这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型引用,当然也可以是对象,而不是引用。

对象和引用的区别,可以看一下C++基础知识方面的书。

/////////////////////////////////////////////////////////////////////////////// MSDN:使用时要#include <afxtempl.h>ConstructionCList Constructs an empty ordered list.建立一个链表example:CList<int,int> myList;//建立一个int链表CList<CString,CString&> myList(16);//建立一个cstring的链表,后面的16表示链表里面数据的个数,如果不写的话,可能是不限个数?CList<MYTYPE,MYTYPE&> myList;//建立一个MYTYPE类型(自定义)的链表如果不存入数据的话,刚建立的链表是空的,头尾都为空Head/Tail AccessGetHead Returns the head element of the list (cannot be empty).返回链表的头数据例子:CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据int tmp=myList.GetHead();//tmp被赋予了0GetTail Returns the tail element of the list (cannot be empty).返回链表的尾数据CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据int tmp=myList.GetTail();//tmp被赋予了9999OperationsRemoveHead Removes the element from the head of the list.移除链表头数据,链表数据个数减1,返回缩减前的头数据例子:CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据int tmp=myList.RemoveHead();//tmp被赋予了之前的头数据:0;同时数据个数变为9999;RemoveTail Removes the element from the tail of the list.移除链表尾数据,链表数据个数减1,返回缩减前的尾数据例子:CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据int tmp=myList.RemoveTail();//tmp被赋予了之前的尾数据:9999;同时数据个数变为9999;AddHead Adds an element (or all the elements in another list) to the head of the list (makes a new head).在链表头处插入新数据,链表数据个数加1,返回新的链表头位置(POSITION); 例子:CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.AddHead(int(314));//链表有了一个新的头数据:314;同时链表个数变为10001;pos为新的头的位置;AddTail Adds an element (or all the elements in another list) to the tail of the list (makes a new tail).在链表尾处插入新数据,链表数据个数加1,返回新的链表尾位置(POSITION); 例子:CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.AddTail(int(314));//链表有了一个新的尾数据:314;同时链表个数变为10001;pos为新的尾的位置;RemoveAll Removes all the elements from this list.清空链表,其头尾皆变成空指针;IterationGetHeadPosition Returns the position of the head element of the list.返回链表头的位置;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetHeadPosition();//获得链表头的位置GetTailPosition Returns the position of the tail element of the list.返回链表尾的位置;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetTailPosition();//获得链表尾的位置GetNext Gets the next element for iterating.返回当前位置的数据,之后,位置后移一位;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetHeadPosition();//获得链表头的位置int tmp=myList.GetNext(pos);//tmp被赋予了头数据的值:0;同时pos指向第二个数据1;GetPrev Gets the previous element for iterating.返回当前位置的数据,之后,位置前移一位;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetTailPosition();//获得链表尾的位置int tmp=myList.GetNext(pos);//tmp被赋予了尾巴数据的值:9999;同时pos指向倒数第二个数据9998;Retrieval/ModificationGetAt Gets the element at a given position.返回指定位置的数据;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetTailPosition();//获得链表尾的位置,还可以继续改变pos,以指向其他数据int tmp=myList.GetAt(pos);//tmp被赋予链表尾的数据SetAt Sets the element at a given position.CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetTailPosition();//获得链表尾的位置,还可以继续改变pos,以指向其他数据myList.SetAt(pos,int(222));//将链表尾部的数据赋成222RemoveAt Removes an element from this list, specified by position.清除指定位置处的数据;同时数据个数减1;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetTailPosition();//获得链表尾的位置myList.RemoveAt(pos);//链表pos(尾部)位置的数据被清除,数据个数变为9999;InsertionInsertBefore Inserts a new element before a given position.在指定位置前插入一个新数据,数据个数加1;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetHeadPosition();//获得第一个数据的位置myList.InsertBefore(pos,int(123));//在第一个数据前插入一个新数据:123,同时数据个数变为10001InsertAfter Inserts a new element after a given position.在指定位置后插入一个新数据,数据个数加1;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.GetHeadPosition();//获得第一个数据的位置myList.InsertAfter(pos,int(123));//在第一个数据后插入一个新数据:123,同时数据个数变为10001SearchingFind Gets the position of an element specified by pointer value.返回指定数据对应的位置;CList<int,int> myList;for(int i=0;i<10000;i++) { myList.AddTail(int(i)); }//存入数据POSITION pos=myList.Find(int(0));//获得0(链表头)的位置FindIndex Gets the position of an element specified by a zero-based index.返回索引号对应的位置;POSITION pos=myList.FindIndex(0);//0表示链表头,以此类推StatusGetCount Returns the number of elements in this list.返回链表的数据个数int num=myList.GetCount();//获得链表的数据个数IsEmpty Tests for the empty list condition (no elements).判定链表是否为空;返回1表示链表是空,返回0表示链表非空;BOOL empty=myList.IsEmpty();。

c语言list函数

c语言list函数

c语言list函数在C语言中,列表(List)是一种常见的数据结构,用于存储一系列有序的元素。

C语言标准库提供了许多用于操作列表的函数,其中包括一些用于创建、遍历和操作列表的函数。

本文将介绍C语言中常用的列表函数,帮助读者更好地理解和使用列表数据结构。

一、创建列表在C语言中,可以使用多种方式创建列表。

其中,最常用的是使用数组和结构体。

1. 数组创建列表使用数组创建列表非常简单,只需要指定数组的大小即可。

例如,创建一个大小为5的整数数组,用于存储一组有序的数字:```cint list[5];list[0] = 1;list[1] = 2;list[2] = 3;list[3] = 4;list[4] = 5;```此时,数组中的元素就形成了一个简单的列表。

可以使用循环遍历该列表,并使用数组下标访问每个元素。

2. 结构体创建列表除了使用数组,还可以使用结构体创建列表。

结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员。

例如,创建一个包含字符串和整数的结构体,用于存储一组有序的数据:```ctypedef struct {char *str;int num;} ListElement;ListElement list[5];list[0].str = "Hello";list[0].num = 1;list[1].str = "World";list[1].num = 2;```此时,结构体中的成员就组成了一个简单的列表。

可以使用结构体指针遍历该列表,并访问每个元素。

二、操作列表C语言标准库提供了许多用于操作列表的函数,包括添加、删除、遍历等操作。

以下是一些常用的列表函数:1. `append()` 函数:将一个元素添加到列表的末尾。

可以使用该函数将一个整数添加到之前创建的结构体列表末尾:```clist[n].num++; // 将当前列表中的所有元素加1```可以使用指针来调用该函数,例如:`append(&list[n], num)`。

c++中列表的用法

c++中列表的用法

c++中列表的用法C++中的列表可以指代多种数据结构,包括数组、链表、向量等。

在这里,我将重点介绍C++标准库中的列表(list)的用法。

在C++中,列表是一种序列容器,它提供了高效的插入和删除操作,但随机访问的性能相对较差。

列表中的元素按照它们被插入的顺序进行排列,这意味着在列表中的元素并不像数组那样在内存中是连续存储的。

要使用C++中的列表,首先需要包含头文件<list>:cpp.#include <list>。

接下来可以使用std命名空间来定义一个列表:cpp.std::list<int> myList;上述代码创建了一个名为myList的整数列表。

可以使用push_back()和push_front()方法向列表中添加元素:cpp.myList.push_back(10); // 在列表末尾添加元素。

myList.push_front(5); // 在列表开头添加元素。

要遍历列表中的元素,可以使用迭代器:cpp.for (std::list<int>::iterator it = myList.begin();it != myList.end(); ++it) {。

std::cout << it << " ";}。

还可以使用范围-based for 循环(C++11及以后版本支持):cpp.for (int& x : myList) {。

std::cout << x << " ";}。

列表还提供了许多其他有用的方法,如insert()、erase()、size()等,以便进行插入、删除和获取列表大小等操作。

另外,列表还支持在任意位置进行插入和删除操作,这是它与数组等数据结构的一个重要区别。

总的来说,C++中的列表是一种非常灵活和高效的数据结构,它在某些场景下比数组和向量更加适用。

C#ListView用法详解(转)

C#ListView用法详解(转)

C#ListView⽤法详解(转)⼀、ListView类1、常⽤的基本属性:(1):设置是否⾏选择模式。

(默认为false) 提⽰:只有在Details视图该属性才有意义。

(2):设置⾏和列之间是否显⽰⽹格线。

(默认为false)提⽰:只有在Details视图该属性才有意义。

(3):设置是否可拖动列标头来对改变列的顺序。

(默认为false)提⽰:只有在Details视图该属性才有意义。

(4):获取或设置项在控件中的显⽰⽅式,包括Details、LargeIcon、List、SmallIcon、Tile(默认为 LargeIcon)(5):设置是否可以选择多个项。

(默认为false)(6):获取或设置列标头样式。

Clickable:列标头的作⽤类似于按钮,单击时可以执⾏操作(例如排序)。

NonClickable:列标头不响应⿏标单击。

None:不显⽰列标头。

(7):设置⽤户是否可以编辑控件中项的标签,对于Detail视图,只能编辑⾏第⼀列的内容。

(默认为false)(8):设置控件中各项的旁边是否显⽰复选框。

(默认为false)(9):⼤图标集。

提⽰:只在LargeIcon视图使⽤。

(10):⼩图标集。

提⽰:只有在SmallIcon视图使⽤。

(11):图像蒙板。

这些图像蒙板可⽤作LargeImageList和SmallImageList图像的覆盖图,这些图像可⽤于指⽰项的应⽤程序定义的状态。

(暂时不⼤懂)(12):获取在控件中选定的项。

(13):获取控件中当前复选框选中的项。

(14):对列表视图的项进⾏排序。

(默认为None)Ascending:项按递增顺序排序。

Descending:项按递减顺序排序。

None:项未排序。

(15):设置当没有⾜够空间来显⽰所有项时是否显⽰滚动条。

(默认为true)(16):设置当⿏标指针悬停于项上时是否⾃动选择项。

(默认为false)(17):设置当⿏标指针经过项⽂本时,其外观是否变为超链接的形式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以下是引自msdn帮助文档(中文是我自己翻译的,错误之处请包涵。

):The template class describes an object that controls a varying-length sequence of elements of type T. The sequence is stored as a bidirectional linked list of elements, each containing a member of type T.本模板类描述了一个对象,这个对象是类型为T的可变长度的序列元素。

这个序列采用双向链表的方式存储每一个元素,其中每一个元素的数据流行都是T。

The object allocates and frees storage for the sequence it controls through a protected object named allocator, of class A. Such an allocator object must have the same external interface as an object of templateclass allocator. Note that allocator is not copied when the object is assigned.对序列对象的分配和释放操作通过一个受保护的对象allocator进行。

这样一个allocator对象必须有相同的外部接口作为一个模板类分配器的对象。

注意:当对象被分配之后allocator不能被复制。

List reallocation occurs when a member function must insert or erase elements of the controlled sequence. In all such cases, only iterators or references that point at erased portions of the controlled sequencebecome invalid.当一个成员要进行insert或者erase操作时,列表的重新分配操作发生。

在这种情况下,只有迭代器或者引用所指向的要删除的对象的指针变为无效。

msdn帮助文档自带的例子下面为msdn帮助文档中自带的一个例子,该例展示了如何使用迭代器读取列表中的元素和进行插入操作。

#include <list>#include <iostream>using namespace std ;typedef list<int> LISTINT;void main(){int rgTest1[] = {5,6,7};int rgTest2[] = {10,11,12};LISTINT listInt;LISTINT listAnother;LISTINT::iterator i;// Insert one at a timelistInt.insert (listInt.begin(), 2);listInt.insert (listInt.begin(), 1);listInt.insert (listInt.end(), 3);// 1 2 3for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert 3 fourslistInt.insert (listInt.end(), 3, 4);// 1 2 3 4 4 4for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert an array in therelistInt.insert (listInt.end(), rgTest1, rgTest1 + 3);// 1 2 3 4 4 4 5 6 7for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert another LISTINTlistAnother.insert (listAnother.begin(), rgTest2, rgTest2+3);listInt.insert (listInt.end(), listAnother.begin(), listAnother.end());// 1 2 3 4 4 4 5 6 7 10 11 12for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;}Program Output is:1 2 31 2 3 4 4 41 2 3 4 4 4 5 6 71 2 3 4 4 4 5 6 7 10 11 12list::list模板类的主要函数介绍assign() //给list赋值back() //返回最后一个元素begin() //返回指向第一个元素的迭代器clear() //删除所有元素empty() //如果list是空的则返回trueend() //返回末尾的迭代器erase() //删除一个元素front() //返回第一个元素get_allocator() //返回list的配置器insert() //插入一个元素到list中max_size() //返回list能容纳的最大元素数量merge() //合并两个listpop_back() //删除最后一个元素pop_front() //删除第一个元素push_back() //在list的末尾添加一个元素push_front() //在list的头部添加一个元素rbegin() //返回指向第一个元素的逆向迭代器remove_if() //按指定条件删除元素remove() //从list删除元素rend() //指向list末尾的逆向迭代器resize() //改变list的大小reverse() //把list的元素倒转size() //返回list中的元素个数sort() //给list排序splice() //合并两个listswap() //交换两个listunique() //删除list中重复的元素常用的操作主要是有插入操作、删除操作。

list为实现头尾高效的插入和删除操作而提供了大多数的支持函数,而对于随机访问函数,则只能从头部或者尾部进行遍历操作。

关于remove和erase函数上面的介绍中关于插入等等操作都有帮助的例子,但是对于删除函数,这个需要有一些注意的地方。

下面请看例子:#include <iostream>#include <list>#include <numeric>#include <algorithm>using namespace std;//创建一个list容器的实例LISTINTtypedef list<int> TESTINT;void main(){//使用TESTINT创建一个list类型的对象TESTINT test;//使用TESTINT创建一个迭代器对象TESTINT:iterator i;//从前面向listOne容器中添加数据test.push_front (2);test.push_front (1);//从后面向listOne容器中添加数据test.push_back (3);test.push_back (4);//从列表中删除一个元素i = test.begin();while(i != test.end()){int tmp = *i;if(tmp == 2){test.erase(i++);//在这里要是指针前进1个,否则迭代器失效}else{i++;}}}总结在使用list的时候不能使用随机访问的方式,只能按照迭代的方式进行访问,这样的话在进行删除操作的时候就可能会出现某一次删除操作之后指针没有指向下一个有效的元素而导致迭代器失效。

因此,在进行删除操作时候最好使用while的方式,使用for循环如果控制不好,可能会导致迭代器失效。

使用模版类可以极大的提高编程的效率,想想之前为了实现每个目标区域像素点的存取操作而使用这个方法都没有很好的解决问题,真后悔没有足够的知识积累,在此记录下来,共勉之。

附件下面的资料是在学习list模版类中找到的,以下内容均来自互联网。

C++ Lists(链表)Lists将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.assign() 给list赋值back() 返回最后一个元素begin() 返回指向第一个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除一个元素front() 返回第一个元素get_allocator() 返回list的配置器insert() 插入一个元素到list中max_size() 返回list能容纳的最大元素数量merge() 合并两个listpop_back() 删除最后一个元素pop_front() 删除第一个元素push_back() 在list的末尾添加一个元素push_front() 在list的头部添加一个元素rbegin() 返回指向第一个元素的逆向迭代器remove() 从list删除元素remove_if() 按指定条件删除元素rend() 指向list末尾的逆向迭代器resize() 改变list的大小reverse() 把list的元素倒转size() 返回list中的元素个数sort() 给list排序splice() 合并两个listswap() 交换两个listunique() 删除list中重复的元素附List用法实例:#include <iostream>#include <list>#include <numeric>#include <algorithm>using namespace std;//创建一个list容器的实例LISTINTtypedef list<int> LISTINT;//创建一个list容器的实例LISTCHARtypedef list<char> LISTCHAR;void main(void){//--------------------------//用list容器处理整型数据//--------------------------//用LISTINT创建一个名为listOne的list对象LISTINT listOne;//声明i为迭代器LISTINT::iterator i;//从前面向listOne容器中添加数据listOne.push_front (2);listOne.push_front (1);//从后面向listOne容器中添加数据listOne.push_back (3);listOne.push_back (4);//从前向后显示listOne中的数据cout<<"listOne.begin()--- listOne.end():"<<endl;for (i = listOne.begin(); i != listOne.end(); ++i)cout << *i << " ";cout << endl;//从后向后显示listOne中的数据LISTINT::reverse_iterator ir;cout<<"listOne.rbegin()---listOne.rend():"<<endl;for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {cout << *ir << " ";}cout << endl;//使用STL的accumulate(累加)算法int result = accumulate(listOne.begin(), listOne.end(),0); cout<<"Sum="<<result<<endl;cout<<"------------------"<<endl;//--------------------------//用list容器处理字符型数据//--------------------------//用LISTCHAR创建一个名为listOne的list对象LISTCHAR listTwo;//声明i为迭代器LISTCHAR::iterator j;//从前面向listTwo容器中添加数据listTwo.push_front ('A');listTwo.push_front ('B');//从后面向listTwo容器中添加数据listTwo.push_back ('x');listTwo.push_back ('y');//从前向后显示listTwo中的数据cout<<"listTwo.begin()---listTwo.end():"<<endl;for (j = listTwo.begin(); j != listTwo.end(); ++j)cout << char(*j) << " ";cout << endl;//使用STL的max_element算法求listTwo中的最大元素并显示 j=max_element(listTwo.begin(),listTwo.end());cout << "The maximum element in listTwo is: "<<char(*j)<<endl; }#include <iostream>#include <list>using namespace std;typedef list<int> INTLIST;//从前向后显示list队列的全部元素void put_list(INTLIST list, char *name){INTLIST::iterator plist;cout << "The contents of " << name << " : ";for(plist = list.begin(); plist != list.end(); plist++)cout << *plist << " ";cout<<endl;}//测试list容器的功能void main(void){//list1对象初始为空INTLIST list1;//list2对象最初有10个值为6的元素INTLIST list2(10,6);//list3对象最初有3个值为6的元素INTLIST list3(list2.begin(),--list2.end());//声明一个名为i的双向迭代器INTLIST::iterator i;//从前向后显示各list对象的元素put_list(list1,"list1");put_list(list2,"list2");put_list(list3,"list3");//从list1序列后面添加两个元素list1.push_back(2);list1.push_back(4);cout<<"list1.push_back(2) and list1.push_back(4):"<<endl;put_list(list1,"list1");//从list1序列前面添加两个元素list1.push_front(5);list1.push_front(7);cout<<"list1.push_front(5) and list1.push_front(7):"<<endl;put_list(list1,"list1");//在list1序列中间插入数据list1.insert(++list1.begin(),3,9);cout<<"list1.insert(list1.begin()+1,3,9):"<<endl;put_list(list1,"list1");//测试引用类函数cout<<"list1.front()="<<list1.front()<<endl;cout<<"list1.back()="<<list1.back()<<endl;//从list1序列的前后各移去一个元素list1.pop_front();list1.pop_back();cout<<"list1.pop_front() and list1.pop_back():"<<endl; put_list(list1,"list1");//清除list1中的第2个元素list1.erase(++list1.begin());cout<<"list1.erase(++list1.begin()):"<<endl;put_list(list1,"list1");//对list2赋值并显示list2.assign(8,1);cout<<"list2.assign(8,1):"<<endl;put_list(list2,"list2");//显示序列的状态信息cout<<"list1.max_size(): "<<list1.max_size()<<endl; cout<<"list1.size(): "<<list1.size()<<endl;cout<<"list1.empty(): "<<list1.empty()<<endl;//list序列容器的运算put_list(list1,"list1");put_list(list3,"list3");cout<<"list1>list3: "<<(list1>list3)<<endl;cout<<"list1<list3: "<<(list1<list3)<<endl;//对list1容器排序list1.sort();put_list(list1,"list1");//结合处理list1.splice(++list1.begin(), list3);put_list(list1,"list1");put_list(list3,"list3");}补充:STL标准函数find进行vector 、list链表查找#include <vector>#include <algorithm>#include <iostream>class example{public:example(int val){i = val;}bool operator==(example const & rhs){return (i == rhs.i) ? true : false;}private:int i;};using namespace std;int main(void){vector<example> ve;ve.push_back(1);vector<example>::iterator it;example elem(1);it = find(ve.begin(), ve.end(), elem);cout<<boolalpha<<(*it == elem);}C++中的vector使用范例一、概述vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

相关文档
最新文档