C++标准模板库与数据结构的学习

简介:   STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可

  STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

体验STL中的list

  STL中提供的list类,是一个双向循环链表类。从每一个元素(节点),都可以访问前面一个元素和后面一个元素。在STL中,list提供了一系列的成员函数,实则完成的就是链表中的基本运算,以及其他在数据结构中不作为基本运算,但在工程中常用到的功能。
  例如:

int data[6]={3,5,7,9,2,4};  
list<int> lidata(data, data+6);  //list是个模板类,用<int>表明,其数据元素为int型
lidata.push_back(6);  
...

  list初始化时,申请的空间大小为6,存放下了data中的6个元素,当向lidata插入第7个元素“6”时,list申请新的节点单元,插入到list链表中,数据存放结构如下图所示:
这里写图片描述

list用在程序中

下面的程序,演示了使用list的更完整的过程。可以看到,只要在头部使用#include (该头文件提供class list的声明),list类中预置的功能即能够方便地使用,并且,数据元素的类型,依靠着模板机制可以自由使用。

#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>

using namespace std;

//创建一个list容器的实例LISTINT
typedef list<int> LISTINT;

//创建一个list容器的实例LISTCHAR
typedef list<char> LISTCHAR;

int main()
{
    //--------------------------
    //用list容器处理整型数据
    //--------------------------
    //用LISTINT创建一个名为listOne的list对象
    LISTINT listOne;
    //声明i为迭代器
    LISTINT::iterator i;

    //从前面向listOne容器中添加数据
    listOne.push_front (2);
    listOne.push_front (1);

    //从后面向listOne容器中添加数据
    listOne.push_back (3);
    listOne.push_back (4);

    //从前向后显示listOne中的数据
    cout<<"listOne.begin()--- listOne.end():"<<endl;
    for (i = listOne.begin(); i != listOne.end(); ++i)
        cout << *i << " ";
    cout << endl;

    //从后向后显示listOne中的数据
    LISTINT::reverse_iterator ir;
    cout<<"listOne.rbegin()---listOne.rend():"<<endl;
    for (ir =listOne.rbegin(); ir!=listOne.rend(); ir++)
    {
        cout << *ir << " ";
    }
    cout << endl;

    //使用STL的accumulate(累加)算法
    int result = accumulate(listOne.begin(), listOne.end(),0);
    cout<<"Sum="<<result<<endl;
    cout<<"------------------"<<endl;

    //--------------------------
    //用list容器处理字符型数据
    //--------------------------

    //用LISTCHAR创建一个名为listOne的list对象
    LISTCHAR listTwo;
    //声明i为迭代器
    LISTCHAR::iterator j;

    //从前面向listTwo容器中添加数据
    listTwo.push_front ('A');
    listTwo.push_front ('B');

    //从后面向listTwo容器中添加数据
    listTwo.push_back ('x');
    listTwo.push_back ('y');

    //从前向后显示listTwo中的数据
    cout<<"listTwo.begin()---listTwo.end():"<<endl;
    for (j = listTwo.begin(); j != listTwo.end(); ++j)
        cout << char(*j) << " ";
    cout << endl;

    //使用STL的max_element算法求listTwo中的最大元素并显示
    j=max_element(listTwo.begin(),listTwo.end());
    cout << "The maximum element in listTwo is: "<<char(*j)<<endl;
    return 0;
}

list类中的成员函数

  list中提供了丰富的成员函数,用于实现对list的各种操作。这给使用者带来的方便,背后隐藏的是,经过严格的软件工程流程出厂的产品,在质量上的保证。所以在实际项目的开发中,下面的成员函数,还是建立感情吧。

  • assign() 给list赋值
  • back() 返回最后一个元素
  • clear() 删除所有元素
  • empty() 如果list是空的则返回true
  • end() 返回末尾的迭代器
  • erase() 删除一个元素
  • front() 返回第一个元素
  • get_allocator() 返回list的配置器
  • insert() 插入一个元素到list中
  • max_size() 返回list能容纳的最大元素数量
  • merge() 合并两个list
  • pop_back() 删除最后一个元素
  • pop_front() 删除第一个元素
  • push_back() 在list的末尾添加一个元素
  • push_front() 在list的头部添加一个元素
  • rbegin() 返回指向第一个元素的逆向迭代器
  • remove() 从list删除元素
  • remove_if() 按指定条件删除元素
  • rend() 指向list末尾的逆向迭代器
  • resize() 改变list的大小
  • reverse() 把list的元素倒转
  • size() 返回list中的元素个数
  • sort() 给list排序
  • splice() 合并两个list
  • swap() 交换两个list
  • unique() 删除list中重复的元素

有了STL,学数据结构做甚么?

  哦,原来STL这么好,数据的存储结构定义成了类,其中的基本操作和常用功能也用成员函数实现,知道接口,一切搞定,分分钟的事。
  可以,问题来了。有这么方便的“基础设施”,花功夫学数据结构课干什么?
  第一,作为专业人员,你可能会做“底层”工作,开发出比STL更好的东东,这个理想可以有,这个需求一直在;
  第二,只会套接口读手册写代码的,是码奴,知道其内部道道,才能够对现在的库驾驭自如,才能使用好基础设施,生产出真正高质量的产品。这里说的知道,不是入微到每一行代码都明了,而是对其内部的原理“有感觉”,这是专业人员应该具备的。给内行用的东西,你要成为内行。
  第三,再全的的工具,总有疏漏,当遇到一个需求,基础设施中没有时,只能自己造。没有数据结构功底,找别人造吧。找别人容易,但问题是,关键时候你就撤,撤哪儿去呢?
  第四,数据结构是专业功底,不只是用来干活的,还是指导思维的。即使只说动手能力,到底是hand最重要,还是brain更重要,不言自明。

  在知其然知其所以然的路上,奋进吧。基础的数据结构,实用的STL,都可以有。

  恰在刚才,一位同学在答疑区说“内容太多太复杂”。我回答:“有什么办法?人生来就是要奋斗的。”当跨过了这座山,回头却只是个小山丘,因为你已经身处高处。

相关链接:
STL入门
C++参考
数据结构网络课程主页

目录
相关文章
|
16天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
41 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
57 4
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
36 3
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
33 0