C++之STL初探

STL简介

STL 是"Standard Template Library"的缩写,中文译为"标准模板库"。STL 是 C++ 标准库的一部分。

STL可以说是C++模板的产物,随着C++对模板的支持越来越好,STL就借助模板的力量把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。 从内容上看,STL一个就是容器与算法的大杂烩,并且这些容器和算法都是经过高度优化的,性能极佳。

程序员们通过对STL的学习和使用,可以高价高效灵活地处理一些复杂的数据结构(例如可以用vector代替数组),使得开发者们可以将更多的精力去实现业务逻辑。

通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成。而容器和算法就是STL中的核心,其他的比如迭代器等都是为了这两部分而服务的。

所谓基础不牢,地动山摇,下面我们先简单来介绍一下STL中的两大核心内容:容器和迭代器。后后续的章节打打铺垫...

STL容器

所谓的容器,我们可以理解为某种数据结构的集合。

STL中的容器又分为两大类:序列容器和关联容器。其中序列容器包括arrayvectordequelistforward_list等。 而关联容器又有mapmultimapset 以及multiset等,在C++11之后又新增了unordered_mapunordered_set等无序的关联容器, 在查询效率上它们比mapset更有效率。

通过以下这张图我们简单地先来了解下STL中容器的大致能力

比如我们看看序列容器vector的简单使用:

c 复制代码
#include <iostream>
#include "vector"

int main() {
    std::vector<int> vec;
    // 放入一个元素
    vec.push_back(1);
    // 放入一个元素,它和push_back有啥区别呢?
    vec.emplace_back(2);
    // 动态数组是否为空
    vec.empty();
    // 插入一个元素
    vec.insert(vec.begin(),100);
    // 元素的个数
    vec.size();
    // 返回第一个元素
    auto a = vec.front();
    std::cout << "a:" << a << std::endl;
    // 最后一个元素
    auto b = vec.back();
    std::cout << "b:" << b << std::endl;
    // 删除一个元素
    vec.erase(vec.begin());
    // 容器变量
    for (auto item:vec) {
        std::cout << "item:" << item << std::endl;
    }
    return 0;
}

你从上面的实例中有没有感觉STL的便捷呢?更多关于STL的容器的具体用法我们在后面单独章节再给大家一一介绍...

STL迭代器

无论是那种容器,我们在开发过程中使用最多的便是对容器的增删改查,为了使得这一工作更加统一方便,可以使用STL中的迭代器来操作。

就笔者理解而言,笔者认为迭代器其实就是一种高阶的指针运算,它可以只想容器的中的元素,通过迭代器可以对容器中的元素进行访问和遍历,甚至是修改。

而迭代器又可以分为五种迭代器,分别为输入迭代器输出迭代器前向迭代器双向迭代器随机访问迭代器

同样,以下这张图也简单总结了一下五种迭代器的能力:

在上面的五种迭代器中,其中输入迭代器和输出迭代器比较特殊,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象。

STL中虽然有5中迭代器,但是并不是说所有的容器都能使用这五种迭代器,有可能有些容器仅支持五种迭代器中的某几种,需要开发者具体情况具体分析。

尽管这些迭代器有着不同的能力,但是这些迭代器有都着较为统一的定义方式,它们的定义格式一般如下

容器类名::iterator 迭代器名;

和C++中的常量类似,一个迭代器也可是常量迭代器,对于非常量迭代器和常量迭代器的区别一般就是可读写和只读的关系。

例如有一个正向迭代器容器类名::iterator 迭代器名;那么它对应的常量迭代器则是器类名::const_iterator 迭代器名;

简单的代码实例:

c 复制代码
#include <iostream>
#include "vector"
#include <iomanip>

int main() {
    std::vector<std::string> vec;
    vec.emplace_back("hello");
    vec.emplace_back("world");
    // 正向迭代器
    std::vector<std::string>::iterator it = vec.begin();
    // 使用迭代器比较
    while (it != vec.end()){
        // *it获取迭代器指向内容
        std::cout << "stringContent:" << *it << std::endl;
        ++it;
    }
    std::cout << "###########华丽的分割线############"<< std::endl;
    // 反向迭代器
    std::vector<std::string>::reverse_iterator r_it = vec.rbegin();
    // 使用迭代器比较
    while (r_it != vec.rend()){
        // *it获取迭代器指向内容
        std::cout << "stringContent:" << *r_it << std::endl;
        ++r_it;
    }

    return 0;
}

输出内容如图:

好了,关于STL的概述先了解到这里,后续会针对STL中的各种容的详细使用以及各种主要避坑事项再做分解学习,关注我,后期不定期更新...

相关推荐
1***s63218 小时前
C++移动语义优化
开发语言·c++
Murphy_lx19 小时前
C++ std_stringstream
开发语言·c++·算法
Mr.Winter`19 小时前
基于Proto3和单例模式的系统参数配置模块设计(附C++案例实现)
c++·人工智能·单例模式·机器人
哭泣方源炼蛊20 小时前
HAUE 新生周赛(七)题解
数据结构·c++·算法
_OP_CHEN20 小时前
从零开始的Qt开发指南:(五)Qt 常用控件之 QWidget(上):解锁 Qt 界面开发的核心基石
开发语言·c++·qt·前端开发·qwidget·gui开发·qt常用控件
sulikey1 天前
深入讲解:什么是 RAII(资源获取即初始化)——原理、实现、面试常考点与实战示例
c++·面试·智能指针·raii·shared_ptr·auto_ptr·资源获取即初始化
艾莉丝努力练剑1 天前
【Git:多人协作】Git多人协作实战:从同分支到多分支工作流
服务器·c++·人工智能·git·gitee·centos·项目管理
散峰而望1 天前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
利刃大大1 天前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
笑非不退1 天前
C# c++ 实现程序开机自启动
开发语言·c++·c#