std list vector,
原帖地址:3358hi.baidu.com/yanfei _ 1/blog/item/a0a 538331 f 5256 f 91 a 4c FBA . html
c标准模板库(STL)是一个容器和算法的类库。容器通常包含相同类型的数据。STL中常用的容器有vector、set和map,常用的算法有Sort等。
一.矢量
1.声明:
向量类似于动态一维数组。
Vector int //声明一个元素是int类型的向量a
vetot my type//声明一个向量a,它的元素是我的类型
这里声明的a包含0个元素,即使a.size()的值为0,但它是动态的,它的大小会随着数据的插入而变化。
和删除更改。
向量int a(100,0);//这里声明的是一个存储了100个零的整数向量。
2.向量运算
常见功能:
size _ t size();//返回向量的大小,即包含的元素数量
void pop _ back();//删除向量末尾的元素,向量大小减一。
void push _ back();//用于在向量的末尾添加一个元素
t back();//返回向量末尾的元素
void clear();//清空向量,向量大小变为0
其他访问方法:
cout a[5]endl;
cout a . at(5)endl;
区别在于,后者在访问越界时抛出异常,而前者不会。
示例:
int intarray[10];
vector int first_vector(intarray,int array 10);
vector int second _ vector(first _ vector . begin()、first _ vector . end());
阶级男人
{
公共:
AnsiStirng id
注册MC;
}
vector man manList
男人这个男人;
thisman.id= 2001
this man . name= your name ;
man list . push _ back this man;//添加第一个元素
thisman.id= 2002
this man . name= my name ;
man list . push _ back this man;//添加第二个元素
man list . clear();//空的
穿越
(1).for(vector datatype:iterator it=a . begin();它!=a . end();它)
cout * it endl
(2).for(int I=0;I a . size;我)
cout a[I]endl;
二。地图
是MapSTL的一个关联容器,提供了一对一的数据处理能力(第一个可以称为关键字,每个关键字在MAP中只能出现一次,第二个可以称为关键字的值)。由于这个特征,
map内部实现构建红黑树(非正式意义上的平衡二叉树),具有自动排序数据的功能。
这里有一个关于什么是一对一数据映射的例子。比如在一个班级里,每个学生的学号和他的名字是一一对应的映射关系。这个模型可以很容易地用地图来描述。
很明显,学号是用int描述的,名字是用string描述的(本文用STL中的string代替char *)。
给出了以下地图描述代码:
1.陈述方法:
Map int,string mapStudent
2.数据插入
构建地图容器后,我们可以向其中插入数据。以下是三种插入数据的方法:
第一种方法是用insert函数插入配对数据。
Map int,string mapStudent
mapStudent.insert(pair int,string (1," student _ one "));
第二:用insert函数插入value_type数据。
Map int,string mapStudent
mapStudent.insert(map int,string :value_type (1," student _ one "));
第三种方式:在数组中插入数据。
Map int,string mapStudent
map student[1]=" student _ one ";
map student[2]=" student _ two ";
3.地图的大小
数据被插入到地图中。我们如何知道目前插入了多少数据?您可以使用大小函数:
int nSize=map student . size();
4.数据遍历
第一种方法是应用前向迭代器。
map int,string:iterator ITER;
for(ITER=map student . begin();iter!=map student . end();iter)
cout ITER-first " " ITER-second end;
第二种方法是应用反向迭代器。
map int,string:reverse _ iterator ITER;
for(ITER=map student . Rb egin();iter!=map student . rend();iter)
cout ITER-first " " ITER-second end;
第三种方法:数组。
int nSize=mapStudent.size()
for(int nIndex=1;nIndex=nSizenIndex)
cout map student[nIndex]end;
5.数据搜索(包括确定该关键字是否出现在地图中)
这里有三种数据搜索方法。
第一种方法是使用count函数来确定关键字是否出现,但是无法定位数据的位置。
第二种方法是使用find函数定位数据的位置,它返回一个迭代器,
当数据出现时,它返回数据所在的迭代器。如果在映射中找不到数据,那么它返回的迭代器等于end函数返回的迭代器。
Int main()
{
Map int,string mapStudent
mapStudent.insert(pair int,string (1," student _ one "));
mapStudent.insert(pair int,string (2," student _ two "));
mapStudent.insert(pair int,string (3," student _ three "));
map int,string:iterator ITER;
ITER=map student . find(1);
如果(iter!=mapStudent.end())
{
Cout "Find,值为" ITER-second endl;
}
其他
{
Cout“不要找”endl
}
}
第三:该方法用于确定数据是否出现。
Lower_bound函数的用法,用于返回要查找的关键字的下界(它是一个迭代器)。
Upper_bound函数的用法,用于返回要查找的关键字的上界(是一个迭代器)。
例如,如果在地图中插入了1,2,3,4,那么lower_bound(2)将返回2,upper-bound(2)将返回3。
Equal_range函数返回一对。对中的第一个变量是Lower_bound返回的迭代器,对中的第二个迭代器是Upper_bound返回的迭代器。如果这两个迭代器相等,这个关键字就不会出现在映射中。程序描述
map pair=map student . equal _ range(2);
if(map pair . first==map pair . second)
cout“不要找”endl
6.清除和判断数据。
Clear()函数可以用来清除地图中的数据,empty()函数可以用来判断地图中是否有数据。如果返回true,则表示地图是空的。
7.数据删除
这里使用了erase函数,它有三个重载函数。
迭代器删除
ITER=map student . find(1);
map student . erase(ITER);
用关键字删除
int n=map student . erase(1);//如果删除,则返回1,否则返回0
使用迭代器逐段删除。
代码清除整个地图。
map student . earse(map student . begin()、map student . end());
//分段删除需要注意的是,这也是STL的特点,删除区间是一个前闭后开的集合。
8.一些其他功能的使用
有swap,key _ comp,value _ comp,get _ allocator等函数。有兴趣可以自己研究一下。
三。设置
Set是一个集合,不会包含重复的元素,和vector不一样。
定义:
定义一个元素为整数的集合A。你可以用
设置int
基本操作:
集合A中的元素是
插入:a .插入(1);
删除元素(如果存在):a . erase(1);
判断一个元素是否属于一个集合:if (a.find(1)!=a.end()).
返回集合元素的数目:a.size()
将集合清除为空集:a.clear()
集合的并、交和差
set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator set int (c,c . begin());
set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator set int (c,c . begin());
set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator set int (c,c . begin());
(注意C之前要清空为空集)。
注意:
重要的是,为了实现集合的快速运算,集合的实现采用了平衡二叉树,因此集合中的元素必须是可排序的。如果是自定义类型,则必须在定义类型的同时给出运算符的定义。
四。分类
排序,顾名思义,就是排序。
用法:
单一关键字:
对于矢量a,
sort( a[0],a[N]);//N=a.size()按升序对中的元素进行排序。
多个关键字:
我们也可以使用类对。
向量对int,int //注意这里两者之间必须有空格,否则编译器会把它当作运算符。
例如:
int N,x,y;
CIN N;
for(int I=0;i i) {
CIN x y;
a.push_back(make_pair(x,y));//make_pair用于创建一个pair对象。
}
sort( a[0],a[N]);
注意:
对于自己定义的类或结构,系统一般不能替我做比较运算,需要自己定义相应的运算符。
布尔运算符(常量类型x,常量类型y)
{
//如果x=y,则返回true,如果x=y,则返回false
}
列表就是列表。
#包含列表
使用命名空间std
typedef list stUserListNode * UserList;//存储用户信息
添加
客户名单。push _ back(当前用户);
删除
客户名单。remove(* remove iterator);
查找
stUserListNode GetUser(char * username)//根据用户名获取用户信息
{
for(UserList:iterator用户迭代器=客户端列表。begin();
UserIterator!=客户列表。end();
用户迭代器)
{
if(strcmp((*用户迭代器)-用户名),用户名)==0)
return *(用户迭代器);
}
抛出异常("找不到该用户");
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。