std list vector,

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: