STL中三大组件基本使用

摘要:本文主要介绍了STL中三大组件——容器、迭代器和算法的基本使用。

1、容器

1.1 STL中容器的研究内容

STL容器实际上研究的是常见的数据结构的实现。

注意:数据结构存在的意义就是提供一种数据的特定排列方式,以方便算法的实现。

1.2 常用的数据结构(容器)以及分类

数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种:

  • 序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。例如:Vector容器、Deque容器、List容器等。
  • 关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。例如:Set/multiset容器 Map/multimap容器

2、算法

2.1 算法的概念

以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).

2.2 算法的分类

算法分为:质变算法非质变算法

  • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

3、迭代器

3.1 迭代器的概念以及作用

  • 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。
  • 迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

3.2 迭代器的种类

输入迭代器

提供对数据的只读访问

只读,支持++、==、!=

输出迭代器

提供对数据的只写访问

只写,支持++

前向迭代器

提供读写操作,并能向前推进迭代器

读写,支持++、==、!=

双向迭代器

提供读写操作,并能向前和向后操作

读写,支持++、--,

随机访问迭代器

提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器

读写,支持++、--、[n]、-n、<、<=、>、>=

4、三大组件的基本使用举例

重点关注以下内容:

4.1 vector容器的定义的方法;

4.2 迭代器的定义和使用;

4.3 迭代器定义的数据可以当做指针使用,明确其意义;

4.3 遍历算法的简单使用

  1 #include <iostream>
  2 #include <string>
  3 #include<vector>
  4 #include <algorithm>  //算法头文件
  5 
  6 using namespace std;
  7 
  8 void myPrint(int v)  //为算法显示提供方法
  9 {
 10     cout << v << endl;
 11 }
 12 
 13 //用容器操作int型数据
 14 void test01() {   
 15     vector<int>v;  //定义一个名字为v的容器,存放int数据
 16 
 17     v.push_back(10);
 18     v.push_back(20);
 19     v.push_back(30);
 20     v.push_back(40);
 21     v.push_back(50);
 22 
 23     //用迭代器进行遍历
 24     for (vector<int>::iterator it=v.begin();it!=v.end();it++)
 25     {
 26         cout << *it << endl;
 27     }
 28     //利用算法进行遍历
 29     for_each(v.begin(),v.end(),myPrint);
 30 }
 31 
 32 //用容器操作自定义的数据类型
 33 class Person {    //首先定义person类
 34 public:
 35     Person(string name,int age) {
 36         this->m_age = age;
 37         this->m_name = name;
 38     }
 39     string m_name;
 40     int m_age;
 41 };
 42 
 43 void test02() {    //容器内存放的是指针类型
 44     vector<Person*>v;
 45     Person p1("小明",18);
 46     Person p2("小红",17);
 47     Person p3("李明",20);
 48 
 49     v.push_back(&p1);
 50     v.push_back(&p2);
 51     v.push_back(&p3);
 52 
 53     for (vector<Person*>::iterator it=v.begin();it!=v.end();it++)
 54     {
 55         cout << "姓名: " << (*it)->m_name << "年龄: " << (*it)->m_age << endl;
 56     }   //这里的it实际上是二级指针
 57 }
 58 void test03() {    //容器内存放的是自定义对象类型
 59     vector<Person>v;
 60     Person p1("小明", 18);
 61     Person p2("小红", 17);
 62     Person p3("李明", 20);
 63 
 64     v.push_back(p1);
 65     v.push_back(p2);
 66     v.push_back(p3);
 67 
 68     for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
 69     {
 70         cout << "姓名: " << it->m_name << "年龄: " << (*it).m_age << endl;
 71     }//这里可以看书迭代器定义的可以按照指针来理解
 72 }
 73 //容器嵌套容器
 74 void test04() {
 75     vector<vector<int>>v;
 76 
 77     vector<int>v1;//定义大容器中的内容
 78     vector<int>v2;
 79     vector<int>v3;
 80 
 81     for (int i=0;i<5;i++) //将int数据放到各个小容器中
 82     {
 83         v1.push_back(i);
 84         v2.push_back(i+6);
 85         v3.push_back(i+8);
 86     }
 87 
 88     v.push_back(v1);  //将各个定义好的小容器放到大容器中
 89     v.push_back(v2);
 90     v.push_back(v3);
 91 
 92     //遍历所有数据
 93     for (vector<vector<int>>::iterator it=v.begin();it!=v.end();it++)
 94     {
 95         for (vector<int>::iterator itv=it->begin();itv!=it->end();itv++)
 96         {
 97             cout << *itv << " ";
 98         }
 99         cout << endl;
100     }
101 }
102 int main() {
103     //test01();
104     //test02();
105     //test03();
106     test04();
107     system("pause");
108     return 0;
109 }
原文地址:https://www.cnblogs.com/lzy820260594/p/11357119.html