C++中的STL容器类入门(适合有一点点C基础或是想自学的),语言简洁,对新手友好

STL简介

我们先理解一下STL,它是 C++ 标准库的一部分,不用单独安装,引入头文件即可使用。那STL有什么作用呢:就是把算法跟数据结构(即容器)分离开来。
STL包括以下三种:容器,算法,迭代器

容器

一个教室里包含很多学生,教室就是容器,类似C的数组等存放数据的一种组合,一个学校可以有很多间教室,那学校也是一个容器,所以可以嵌套(即容器内有二级容器)。

算法

比如现在有一个数组,里面有两元素,那我们要对他进行一个求和的操作,这个求和操作就是一个最简单的算法,还有排序等,STL大概提供了100个算法

迭代器

类似指针一样,++就指向下一个元素,实际上迭代器是一个重载了操作符的类对象,这个类封装有一个指针迭代器由容器提供,不同的迭代器类型不一样,如果是int型容器,那迭代器只需要跳指定大小的空间就可以,如果是链表那就不行,因为他的内存空间是不连续的,迭代器就是容器与算法沟通使用的桥梁

下面我先写个普通的程序(没有使用到STL),可以复制进去运行加以理解,程序里有详细的注释:,这个程序算法是mycount

#include<iostream>
//算法,负责统计某个元素的个数。
int mycount(int * start,int*end,int val)
{
    int num=0;
    while(start!=end)//他们相等就证明数组遍历完了
    {
        if(*start==val)
        {
            num++;
        }
        start++;
    }
    return num;
}
int main(void)
{
    int arr[]={5,6,7,9,4,6,3};//数组,即容器
    int* pBegin=arr;//数组名的地址即指向数组内第一个元素
    int* pEnd=&(arr[sizeof(arr)/sizeof(int)]);//这里的pBegin与pEnd其实就是迭代器
    //此处pEnd地址是数组最后一位地址再++,即a[7],
    //但实际上并没a[7]
    int num=mycount(pBegin,pEnd,6);
    std::cout<<"这个数字有:"<<num<<"个"<<std::endl;
    return 0;
}

STL的容器实质就是上面的arr数组,用来存放数据元素的
STL的算法实质就是把上面我写的程序里的mycount算法封装起来,然后我们直接调用就可以,上面只是实现个比较简单的算法,所以我们还能自己手撸,但后面算法越加复杂的时候就会浪费大量的时间,并且可能效率不高
STL迭代器的实质就是那两指针,一个指向数组头,另一个指向数组尾的下一个元素,这个也是被封装起来,我们也是直接使用就可以,迭代器一定是由容器提供给算法的。
完整的STL就是包括了这三,可以极大减轻我们的工作量,因为算法都是封装好的,可直接使用
接下来我们看一个完整的使用STL的例子:,一定要自己复制代码去编译一下,然后才可以更容易地理解。
使用到了STL中的 for_each 算法
for_each()事实上是個 function template,其源码如下
链接: http://www.cplusplus.com/reference/algorithm/for_each/?kw=for_each.

template<typename InputIterator, typename Function>
Function for_each(InputIterator beg, InputIterator end, Function f) {
  while(beg != end) 
    f(*beg++);
}

STL例子源码如下

#include<iostream>
#include<vector> //动态数组,可变数组,即容器
#include<algorithm>//封装的算法

void PrintVector(int v)
{
    std::cout<<v<<std::endl;
}

void test01()
{
    //定义一个容器,并且制定这个容器存放的元素类型是int
    std::vector<int> v;
    //push_back在vector类中作用为在vector尾部加入一个数据。
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    //vector<int>::iterator迭代器的数据类型(简单看成int一样属于数据类型就可)
    //Iterator(迭代器)是一个接口,它的作用就是遍历容器的所有元素。
    std::vector<int>::iterator pBegin=v.begin();
    std::vector<int>::iterator pEnd=v.end();

    //for_each是STL提供的一个遍历数组的算法
    //因为不同的数据类型输出方式不一样,这里是Int型,所以打印函数声明为int,所以这个也是必须由容器类这边提供的
    for_each(pBegin,pEnd,PrintVector);
}
int main(void)
{
    test01();
    return 0;
}

到这里为止,大家应该对STL容器类等挺熟悉的了,可以自己动手复制代码实现一下
接下来深入一点,我们看怎么样使用上面所学的知识,遍历一个自己定义的类呢?注意,下面程序并没有使用到算法,只是用了容器以及迭代器。
源码如下:

#include<iostream>
#include<vector> //动态数组,可变数组,即容器
#include<algorithm>//封装的算法

class Person
{
public:
    Person(int age,int id):age(age),id(id){}//声明个构造函数,初始化对象时就顺带赋值
public:
    int age;
    int id;
}; //自定义一个Person类
void test02()
{
    //创建容器,并且指定容器的元素类型是Person
    std::vector<Person> v;
    Person p1(10,20),p2(30,40),p3(50,60);//初始化对象的同时赋值
    v.push_back(p1);//把数据放入动态数组
    v.push_back(p2);
    v.push_back(p3);

    //遍历类
    for (std::vector<Person>::iterator it=v.begin();it !=v.end();it++)
    {
        //这里it是个指针,*it即是他所指向的数据,所以可以进行一个输出
        std::cout<<(*it).age<<" "<<(*it).id<<std::endl;
    }

}
int main(void)
{
    test02();
    return 0;
}

看下图输出结果,可以看到自己定义的类内容都可以正常输出。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42569526/article/details/107778235