C++标准模板库STL学习总结

男娘i 2022-11-21 01:20 411阅读 0赞

STL提供了一组表示容器、迭代器、函数对象和算法的模板。
STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是创建可重用的代码。泛型编程旨在编写独立于数据类型之外的代码。
首先是处理容器的算法,尽可能使用通用的术语来表达算法,使之独立于数据类型和容器类型。

  • 容器,是一个与数组类似的单元,可以存储若干个值,STL容器是同质的,即存储值的类型相同。
  • 算法,是完成特定任务(比如完成排序和查找)的处方。
  • 迭代器,能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。
  • 函数对象,是类似函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。
  1. ### STL ###
  2. * 迭代器
  3. * for\_each()函数
  4. * random\_shuffle()函数
  5. * 基于范围的for循环(C++11
  6. * 容器
  7. * * 容器概念
  8. * 序列
  9. * 函数对象

迭代器

迭代器是一个广义指针,它可以是指针,也可以是一个可对其执行类似指针操作(如解引用和递增)的对象。通过指针广义化为迭代器,让STL能够为不同的容器类提供统一的接口。

迭代器使用示例:
使用C++11的自动类型推断

  1. auto pd2 = scores.begin();

清空容器

  1. //方法1
  2. //scores.erase(scores.begin(), scores.end());
  3. //方法2
  4. scores.clear();

push_back()—将元素添加到矢量末尾

  1. scores.push_back(8.8);

erase(it1,it2)—接收两个迭代器参数,删除区间:[it1,it2),删除元素从it1到it2,但不包括it2

  1. scores.erase(scores.begin(), scores.begin() + 2);

insert()—插入元素,接收三个迭代器参数:第一个是新元素的插入位置,第二个和第三个定义被插入区间,该区间通常是另一个容器对象的一部分

  1. scores = {
  2. 1,2,3,4,5,6.6,7.7 };
  3. vector<double> new_v = {
  4. 0.2,0.6,0.7,0.8};
  5. scores.insert(scores.begin() + 3, new_v.begin() + 1, new_v.end());

swap()—交换两个容器的内容

  1. scores.swap(new_v);
  2. //使用拷贝函数生成副本
  3. vector<double> oldlist(scores);
  4. #include <iostream>
  5. #include<string>
  6. #include<vector>
  7. using namespace std;
  8. int main(void) {
  9. //为vector类的double类型声明一个迭代器:
  10. vector<double>::iterator pd;
  11. vector<double> scores = {
  12. 1,2,3,4,5,6.6,7.7};
  13. //迭代器的行为就像指针
  14. pd = scores.begin();
  15. *pd = 23.3;
  16. ++pd;
  17. //使用C++11的自动类型推断
  18. auto pd2 = scores.begin();
  19. //push_back()---将元素添加到矢量末尾
  20. scores.push_back(8.8);
  21. //erase(it1,it2)---接收两个迭代器参数,删除区间:[it1,it2),删除元素从it1到it2,但不包括it2
  22. scores.erase(scores.begin(), scores.begin() + 2);
  23. //使用迭代器遍历容器
  24. cout << "scores:" << endl;
  25. for (pd = scores.begin(); pd != scores.end(); pd++)
  26. {
  27. cout << *pd<<" " ;
  28. }
  29. cout << "" << endl;
  30. //清空容器
  31. //方法1
  32. //scores.erase(scores.begin(), scores.end());
  33. //方法2
  34. scores.clear();
  35. cout << "scores.size(): "<<scores.size() << endl;
  36. //insert()---插入元素,接收三个迭代器参数:
  37. //第一个是新元素的插入位置,第二个和第三个定义被插入区间,该区间通常是另一个容器对象的一部分
  38. scores = {
  39. 1,2,3,4,5,6.6,7.7 };
  40. vector<double> new_v = {
  41. 0.2,0.6,0.7,0.8};
  42. scores.insert(scores.begin() + 3, new_v.begin() + 1, new_v.end());
  43. cout << "insert:" << endl;
  44. for (pd = scores.begin(); pd != scores.end(); pd++)
  45. {
  46. cout << *pd << " ";
  47. }
  48. cout << "" << endl;
  49. //swap()---交换两个容器的内容
  50. scores.swap(new_v);
  51. cout << "After swapping:" << endl;
  52. for (pd = scores.begin(); pd != scores.end(); pd++)
  53. {
  54. cout << *pd << " ";
  55. }
  56. cout << "" << endl;
  57. //使用拷贝函数生成副本
  58. vector<double> oldlist(scores);
  59. for (pd = oldlist.begin(); pd != oldlist.end(); pd++)
  60. {
  61. cout << *pd << " ";
  62. }
  63. cout << "" << endl;
  64. return 0;
  65. }
  66. /*
  67. 结果:
  68. scores:
  69. 3 4 5 6.6 7.7 8.8
  70. scores.size(): 0
  71. insert:
  72. 1 2 3 0.6 0.7 0.8 4 5 6.6 7.7
  73. After swapping:
  74. 0.2 0.6 0.7 0.8
  75. 0.2 0.6 0.7 0.8
  76. */

for_each()函数

接收三个参数,前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象)。for_each()函数应用于容器区间的各个元素,被指向的函数不能更改容器元素的值。可以用for_each()代替for循环,

  1. void showData(const double & d){
  2. cout << d << " ";
  3. }
  4. for (pd = scores.begin(); pd != scores.end(); pd++)
  5. {
  6. showData(*pd);
  7. }

可以用for_each()代替:

  1. void showData(const double & d){
  2. cout << d << " ";
  3. }
  4. for_each(scores.begin(),scores.end(),showData);

random_shuffle()函数

接受两个指定区间的迭代器参数,并随机排列该区间的元素。

  1. random_shuffle(scores.begin(),scores.end());

基于范围的for循环(C++11)

  1. double prices[5] = {
  2. 1,2,3,4,5,6};
  3. for(double x:prices)
  4. cout<<x<<endl;
  5. for(auto x : scores)
  6. showData(x);

不同于for_each(),基于范围的for循环可以修改容器的内容,诀窍是指定一个引用参数。

  1. for(auto & x : scores)
  2. showData(x);

容器

容器概念

容器是存储其他对象的对象。被存储的对象必须是同一类型。
X表示容器类型,T表示存储在容器中的对象类型。
在这里插入图片描述
在这里插入图片描述

序列

七种STL容器类型(deque、C++11新增的forward_list、list、queue、priority_queue、stack和vector)都是序列。序列要求其元素按严格的线性顺序排列,数组和链表都是序列,但分支结构不是。
t表示类型为T的值,n表示整数,p、q、i和j表示迭代器。
在这里插入图片描述
在这里插入图片描述

函数对象

函数对象时重载了()运算符(即定义了operator()()方法)的类,可以使用函数表示法来调用这种类的对象

发表评论

表情:
评论列表 (有 0 条评论,411人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++标准模板STL学习总结

    STL提供了一组表示容器、迭代器、函数对象和算法的模板。 STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是创建可重用的代