c++中list的使用说明

因公司项目需要,用到list容器  学习笔记如下

1,Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许 快速 的插入和删除,但是随机访问却比较慢.

List用法实例:

用的时候

#include <list>                                // 加入此头文件

//创建一个list容器的实例LISTINT

typedef list<int> LISTINT;        //        顾名思义  容器存放int型的数据

//创建一个list容器的实例LISTCHAR

typedef list<char> LISTCHAR;   //char 型的数据

//用list容器处理整型数据

//--------------------------

//用LISTINT创建一个名为listOne的list对象

LISTINT listOne;

//声明i为迭代器

LISTINT::iterator i;

//从前面向listOne容器中添加数据

listOne.push_front (2);    //    push_back() 在list的末尾添加一个元素

//push_front() 在list的头部添加一个元素

//从后面向listOne容器中添加数据

listOne.push_back (3);      //

//此处显示list中的数据 不再解释

//从前向后显示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;

//用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;

list函数方法如下

用法r如   list.begin();

STL中list的使用:

STL中的list就是一双向链表,可高效地进行插入删除元素。现总结一下它的操作。

文中所用到两个list对象c1,c2分别有元素c1(10,20,30)  c2(40,50,60)。还有一个list<int>::iterator citer用来指向c1或c2元素。

list对象的声明构造():

A.      list<int>c0;                 //空链表

B.      list<int>c1(3);             //建一个含三个默认值是0的元素的链表

C.      list<int>c2(5,2);            //建一个含五个元素的链表,值都是2

D.      list<int>c4(c2);             //建一个c2的copy链表

E.       list<int>c5(c1.begin(),c1.end());

//c5含c1一个区域的元素[_First, _Last)。

1.       assign()分配值,有两个重载:

c1.assign(++c2.begin(), c2.end()) //c1现在为(50,60)。

c1.assing(7,4)  //c1中现在为7个4,c1(4,4,4,4,4,4,4)。

2.       back()返回最后一元素的引用:

int i=c1.back();  //i=30

const int i=c2.back();  //i=60且不可修改

3.       begin()返回第一个元素的指针(iterator)

citer=c1.begin();    // *citer=10

list<int>::const_iterator cciter=c1.begin(); //*cciter=10且为const。

4.       clear()删除所有元素

c1.clear();   //c1为空  c1.size为0;

5.       empty()判断是否链表为空

bool B=c1.empty(); //若c1为空B=true;否则B=false;

6.       end()返回最后一个元素的下一位置的指针(list为空时end()=begin())

citer=c1.end(); //*(--citer)=30;

同begin()返回一个常指针,不能修改其中元素。

7.       erase()删除一个元素或一个区域的元素(两个重载)

c1.erase(c1.begin()); // c1现为(20,30);

c1.erase(++c1.begin(),c1.end()); // c1现为(10);

8.       front() 返回第一个元素的引用:

int i=c1.front(); //i=10;

const int i=c1.front(); //i=10且不可修改。

9.       insert()在指定位置插入一个或多个元素(三个重载):

c1.insert(++c1.begin(),100);   //c1(10,100,20,30)

c1.insert(c1.begin(),2,200);  //c1(200,200,20,30);

c1.insert(++c1.begin(),c2.begin(),--c2.end());

//c1(10,40,50,20,30);

10.    max_size()返回链表最大可能长度(size_type就是int型):

list<int>::size_type i=c1.max_size();  //i=1073741823

11.    merge()合并两个链表并使之默认升序(也可改):

c2.merge(c1);   //c1现为空;c2现为c2(10,20,30,40,50,60)

c2.merge(c1,greater<int>()); //同上,但c2现为降序

12.    pop_back()删除链表尾的一个元素

c1.pop_back()  //c1(10,20);

13.    pop_front()删除链表头的一元素

c1.pop_front() //c1(20,30)

14.    push_back()增加一元素到链表尾

c1.push_back(100) //c1(10,20,30,100)

15.    push_front()增加一元素到链表头

c1.push_front(100) //c1(100,10,20,30)

16.    rbegin()返回链表最后一元素的后向指针(reverse_iterator or const)

list<int>::reverse_iterator riter=c1.rbegin(); //*riter=30

17.    rend()返回链表第一元素的下一位置的后向指针

list<int>::reverse_iterator riter=c1.rend(); // *(--riter)=10

18.    remove()删除链表中匹配值的元素(匹配元素全部删除)

c1.remove(10);     //c1(20,30)

19.    remove_if()删除条件满足的元素(会遍历一遍链表)

c1.remove_if( is_odd<int> () ); //c1(10,20,30) 

//is_odd自己写(表奇数) 

20.    resize()重新定义链表长度(两重载):

c1.resize(4)  //c1(10,20,30,0)用默认值填补

c1.resize(4,100) //c1(10,20,30,100)用指定值填补

21.    reverse()反转链表:

c1.reverse(); //c1(30,20,10)

22.    size()返回链表中元素个数

list<int>::size_type i=c1.size();  //i=3

23.    sort()对链表排序,默认升序(可自定义)

c1.sort();  //c1(10,20,30)

c1.sort(great<int>()); //c1(30,20,10)

24.    splice()对两个链表进行结合(三个重载)

c1.splice(++c1.begin(),c2);

//c1(10,40,50,60,20,30) c2为空 全合并

c1.splice(++c1.begin(),c2,++c2.begin());

//c1(10,50,20,30) ; c2(40,60) 指定元素合并

c1.splice(++c1.begin(),c2,++c2.begin(),c2.end());

//c1(10,50,60,20,30); c2(40) 指定范围合并

25.    swap()交换两个链表(两个重载)

c1.swap(c2);  //c1(40,50,60);

swap(c1,c2);  //c1(40,50,60)

26.    unique()删除相邻重复元素(断言已经排序,因为它不会删除不相邻的相同元素)

c1.unique();

//假设c1开始(-10,10,10,20,20,-10)则之后为c1(-10,10,20,-10)

c1.unique(mypred); //自定义谓词

list 的使用

在使用list必须包括头文件#include <list>,

1)、如何定义一个list对象

#include <list>
int main (void)
{
 list<char > cList; //声明了list<char>模板类 的一个实例
}

2)、使用list的成员函数push_back和push_front插入一个元素到list中

cList. push_back(‘a’); //把一个对象放到一个list的后面
cList. push_front (‘b’); //把一个对象放到一个list的前面

3)、使用list的成员函数empty()判断list是否为空

if (cList.empty())
{
 printf(“this list is empty”);
}

4)、用list< char >::iterator得到指向list的指针

list< char>::iterator charIterator;
for(cIterator = cList.Begin();cIterator != cList.end();cIterator++)
{
 printf(“%c”, *cIterator);
} //输出list中的所有对象

说明:cList.Begin()和cList.end()函数返回指向list< char >::iterator的指针,由于list采用链表结构,因此它不支持随机存取,因此不能用cList.begin()+3来指向list中的第四个对象,vector和deque支持随机存取。

5)、用STL的通用算法count()来统计list中的元素个数

int cNum;
char ch = ’b’;
cNum = count(cList.Begin(), cList.end(), ch); //统计list中的字符b的个数

说明:在使用count()函数之前必须加入#include <algorithm>

6)、用STL的通用算法count_if ()来统计list中的元素个数

const char c(‘c’);
class IsC
{
public:
 bool operator() ( char& ch )
 {
  return ch== c;
 }
};

int numC;
numC = count_if (cList.begin(), cList.end(),IsC());//统计c的数量;

说明:count_if() 带一个函数对象的参数,函数对象是一个至少带有一个operator()方法的类函数对象被约定为STL算法调用operator时返回true或false。它们根据这个来判定这个函数。举个例子会 说的更清楚些。count_if()通过传递一个函数对象来作出比count()更加复杂的评估以确定一个对象是否应该被记数。

7)、使用STL通用算法find()在list中查找对象

list<char >::iterator FindIterator;
FindIterator = find(cList.begin(), cList.end(), ‘c’);
If (FindIterator == cList.end())
{
 printf(“not find the char ‘c’!”);
}
else
{
 printf(“%c”, * FindIterator);
}

说明:如果没有找到指定的对象,就会返回cList.end()的值,找到了就返回一个指向对象iterator的指针。

8)、使用STL通用算法find_if()在list中查找对象

const char c(‘c’);
class c
{
public:
 bool operator() ( char& ch )
 {
  return ch== c;
 }
};

list<char>::iterator FindIterator
FindIterator = find_if (cList.begin(), cList.end(),IsC());//查找字符串c;

说明:如果没有找到指定的对象,就会返回cList.end()的值,找到了就返回一个指向对象iterator的指针。

9)、使用list的成员函数sort()排序

cList.sort();

10)、使用list的成员函数insert插入一个对象到list中

cList.insert(cLiset.end, ‘c’); ///在list末尾插入字符‘c’

char ch[3] ={‘a’, ‘b’, ‘c’};
cList.insert(cList.end, &ch[0], & ch[3] ); //插入三个字符到list中

说明:insert()函数把一个或多个元素插入到指出的iterator位置。元素将出现在 iterator指出的位置以前。

11)、如何在list中删除元素

cList.pop_front(); //删除第一个元素
cList.pop_back(); //删除最后一个元素
cList. Erase(cList.begin()); //使用iterator删除第一个元素;
cList. Erase(cList.begin(), cList.End()); //使用iterator删除所有元素;
cList.remove(‘c’); //使用remove函数删除指定的对象;

list<char>::iterator newEnd;
//删除所有的’c’ ,并返回指向新的list的结尾的iterator
newEnd = cList.remove(cList.begin(), cList.end(), ‘c’);

时间: 2024-07-28 16:45:18

c++中list的使用说明的相关文章

Android_08手机联系人编码中SimpleAdapter的使用说明

1. SimpleAdapter  adapter = new SimpleAdapter(this, list1,R.layout.my_layout, new String[] { "name", "keyvalue" },new int[] { R.id.tv_name, R.id.tv_info }); lv_search.setAdapter(adapter); 解释: 一)this:(1).当存放在自己的class中并且被自己调用时,就用this:而且这

Struts2页面开发中常用标签使用说明

1. Struts2页面开发中常用标签使用说明 1.1.往action里传值的使用方式: <input name="userName" type="text" class="input6" size="15"> a. userName属性需要在访问的action中提供相应的属性,并有SET/GET方法. b. 可以不在访问的action中提供相应的属性,用request. getParameter_r(“userN

计算机中所有快捷键使用说明

以下是计算机中所有快捷键使用说明! 单独按Windows:显示或隐藏"开始"功能表 Windows+BREAK:显示"系统属性"对话框 Windows+D:显示桌面 Windows+M:最小化所有窗口 Windows+Shift+M:还原最小化的窗口 Windows+E:开启"资源管理器" Windows+F:查找文件或文件夹 Windows+CTRL+F:查找电脑 Windows+F1:显示Windows"帮助" Windo

数字证书中keytool命令使用说明

这个命令一般在JDK\jre\lib\security\目录下操作 keytool常用命令 -alias       产生别名 -keystore    指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的,              你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个) -storepass   指定密钥库的密码 -keypass     指定别名条目的密码 -list        显示密钥库中的证书信息 -v    

maya中MFnMesh.h使用说明的翻译

由于最近要修改一个maya中的deformer脚本,于是开始系统学习openMaya的一些知识,当然少不了得把一堆头文件说明看一遍.首先把MFnMesh.h这个文件翻译一下吧,不废话,上译文: 首先MFnMesh.h是一个关于polygon面的装置.以下术语虽然名字不同,但含义一样: mesh,object: polygon,face: object-relative indices,global/mesh-relative indices: face-relative indices,loca

altium designer中Net Label 使用说明

网络连接方式      Altium Designer提供了6类网络标识:Net Label(网络标号),Port(端口),Sheet Entry(图纸入口),Power Port(电源端口),Hidden Pin(隐匿引脚).Off-sheet Connector(图纸外连接符).网络标识是通过名字来连接的,名字相同就可以传递信号.但是特别要注意的是,除了“Port”与“Sheet Entry”这一对标识以外,其它不同类的网络标识,即使标识名字相同,相互之间也没有连接.比如Net Label及

hdwiki中模板的使用说明

HDwiki所有模版文件都在根目录view下的default文件里,以admin_开头的是后台的模版文件,其它不是以admin_开头的,就是所有的前台文件.具体列表如下:首页模版文件:  index.htm 首页模版文件基础模版文件      header.htm 网站头文件,包括网站LOGO.搜索框和网站导航等.footer.htm 网站底部文件,包括备案信息.时间时区显示和风格显示等.message.htm 信息提示页面模版文件用户相关模版文件box.htm 个人空间短消息模版文件black

LoadRunner中关联技术使用说明

1.LoadRunner在实名情况下用关联技术? 答:loadRunner中的VUG在录制脚本的时候执行正常,在回放脚本的时候执行失败,存在动态数据信息,考虑做关联 2.什么是关联技术? 答:把脚本中的硬编码(写死的数据),转变为服务器发送的动态,每次都在改变的数据, 3.在LoadRunner中如何做关联? 答:1.同一个业务场景,录制两次脚本数据 2.用WDiff 做对比发现脚本中的动态数据 3.复制动态数据的一段,在Generation log中搜索到第一个相应包,找到相应的请求,根据相应

js中eval()的使用说明

今天写小游戏sdk的时候,对方调用我的方法,然后传了个方法过来,我用eval判断了一下传过来的是否是function,但是结果出错了,于是想弄明白eval究竟是怎么使用的,查了下资料,记录如下. 定义 eval() 可以接受一个字符串str作为参数,并把这个参数作为脚本代码来执行. 参数 如果参数是一个表达式,eval() 函数将执行表达式: 如果参数是Javascript语句,eval()将执行 Javascript 语句: 如果执行结果是一个值就返回,不是就返回undefined,如果参数不