<C++>初识STL —— 标准模板库

简介: <C++>初识STL —— 标准模板库

STL的出现背景


长久以来,软件届就一直希望建立一种可重复利用的东西

C++的面向对象和泛型编程思想,目的就是复用性的提升

数据结构和算法没能有一套标准,导致被迫从事大量重复工作

为了建立数据结构和算法的一套标准,那么STL就诞生了


STL基本概念


STL全称:标准模板库(Standard Template Library)

STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)

容器和算法之间通过迭代器进行无缝连接

STL几乎所有的代码都采用了模板类或者模板函数


STL六大组件


STL六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。


容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。


算法:常用的各种算法,如sort、find、copy、for_each等


迭代器:扮演了容器与算法之间的粘合剂,迭代器的使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。


仿函数:行为类似函数,可作为算法的某种策略


适配器:一种用来修饰容器或者仿函数或迭代器结构的东西。


空间配置器:负责空间的配置与管理。


初识容器算法迭代器

迭代器种类:



        常用的迭代器种类为双向迭代器,和随机访问迭代器。


了解STL容器、算法、迭代器概念之后,我们利用代码感受STL的魅力


STL中最常用的容器为vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器。


vector容器的初次使用


容器:    vector


算法:    for_each


迭代器:vector::iterator


存放内置数据类型


void printInfo(int val) {
  cout << val<<" ";
}
//内置数据类型存放测试
void test02()
{
  vector<int> ve;
  ve.push_back(1);
  ve.push_back(0);
  ve.push_back(0);
  ve.push_back(8);
  ve.push_back(6);
  cout << "此时容器大小为:" << ve.size() << endl;
  cout << "容器数据情况:" << endl;
  //通过迭代器来访问容器中的数据 3种方法
  //1、while循环遍历
  //vector<int>::iterator itBegin = ve.begin();//起始迭代器,指向容器中第一个元素
  //vector<int>::iterator itEnd = ve.end();//结束迭代器,指向容器中最后一个元素的下一个位置
  /*while (itBegin != itEnd)
  {
  cout << *itBegin <<" ";
  itBegin++;
  }*/
  //2、for循环遍历
  /*for (vector<int>::iterator it = ve.begin(); it != ve.end(); it++)
  {
  cout << *it << " ";
  }*/
  //3、for_each遍历
  for_each(ve.begin(),ve.end(),printInfo);
  cout << endl;
}


首先创建整型的vector容器 ve,将1、0、0、8、6依次尾插入ve容器内,然后利用迭代器来访问容器中的数据,分为while、for、for_each三种循环方法:


1、while循环


       创建两个指针itBegin、itEnd分别指向ve容器的第一个位置和最后一个元素的下一个位置,利用while循环,当递增的itBegin不等于itEnd时,输出解引用的itBegin,就可以得到该位置对应的数据,递增的语句是itBegin++。


2、for循环


       创建一个指针即可,也是让指针从begin递增,在不等于end时依次解引用输出数据。这个方法比较方法,我个人推荐使用


3、for_each循环


       使用for_each循环需要先引入头文件#include<algorithm>,这个头文件包含了算法里的方法。参数列表分别是:起始位置,终止位置,打印函数。所以我定义了一个printInfo函数来不换行打印数据。


存放自定义数据类型


//Person类展示
class Person
{
public:
  string name;
  int height;
  Person(string name, int height) {
  this->name = name;
  this->height = height;
  }
};
//自定义类型数据存放测试
void test01()
{
  Person p1("子鼠",120);
  Person p2("丑牛",150);
  Person p3("寅虎",140);
  vector<Person> v;
  v.push_back(p1);
  v.push_back(p2);
  v.push_back(p3);
  for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
  {
  cout << "姓名:" << it->name << " 身高:" << it->height << endl;
  }
}


       vector通过参数列表里的数据类型来决定容器内存放的数据类型,这里参数列表指定时Person类,那么就可以将创建的对象p1、p2、p3存入容器内,再利用for循环打印数据。和上面不同的是,打印姓名身高用的是->操作符,这是因为it相当于一个指针,所以可以直接通过指针调用对象的属性,当然也可以这样写:(*t).name,先解引用再调用的方式也可以。


vector容器的嵌套使用

       容器相当于一个数组,那么数组嵌套数组不就是二维数组吗,我们来测试一下。


//打印嵌套容器的数据
void printVector(vector<vector<int>>V)
{
  cout << "打印嵌套容器数据:" << endl;
  for (vector<vector<int>>::iterator T = V.begin(); T != V.end(); T++)
  {
  for (vector<int>::iterator t = (*T).begin(); t != (*T).end(); t++)
  {
    cout << *t << " ";
  }
  cout << endl;
  }
}
//容器嵌套使用,二维数组
void test03()
{
  vector<vector<int>> V;
  vector<int>v1;
  vector<int>v2;
  vector<int>v3;
  vector<int>v4;
  vector<int>v5;
  for (int i = 1; i < 5; i++)
  {
  v1.push_back(i);
  v2.push_back(i+1);
  v3.push_back(i+2);
  v4.push_back(i+3);
  v5.push_back(i+4);
  }
  V.push_back(v1);
  V.push_back(v2);
  V.push_back(v3);
  V.push_back(v4);
  V.push_back(v5);
  printVector(V);
}


       创建的这个V容器,他的参数列表是vector<int>,那就说明该容器存入的是存入整型数据的容器,说白了就是二维整型数组。然后先创建小容器并进行赋值,再将小容器尾插入大容器内,调用自定义的printVector函数来打印数据。


       二维数组都是两层for循环打印,类似的对于嵌套容器来说也一样。  第一层for循环决定着循环的次数,第二层for循环的(*T)用到了二级指针,也就是说大容器T指针解引用之后还是一个小容器的指针,根据T++这行代码来更新指向也就能改变小指针的容器,从而输出嵌套容器内的所有数据。


运行效果


相关文章
|
23小时前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
4 0
|
5天前
|
存储 算法 搜索推荐
C++|STL简介-string-vector基础运用
C++|STL简介-string-vector基础运用
|
5天前
|
存储 编译器 C++
|
6天前
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
37 0
|
6天前
|
设计模式 算法 C++
【C++】STL之迭代器介绍、原理、失效
【C++】STL之迭代器介绍、原理、失效
13 2
|
23小时前
|
存储 编译器 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(中)
从C语言到C++_11(string类的常用函数)力扣58和415
5 0
|
23小时前
|
存储 C语言 C++
从C语言到C++_11(string类的常用函数)力扣58和415(上)
从C语言到C++_11(string类的常用函数)力扣58和415
5 0
|
23小时前
|
存储 编译器 程序员
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(下)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
4 0
|
1天前
|
C++
【C++基础】类class
【C++基础】类class
9 1
|
1天前
|
安全 程序员 编译器
C++程序中的基类与派生类转换
C++程序中的基类与派生类转换
8 1