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++参考

数据结构网络课程主页

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-09 00:30:12

C++标准模板库与数据结构的学习的相关文章

C++标准模板库(STL)学习

1.什么是标准模板库STL(Standard Template Lib) 在之前已经学习过函数模板和类模板的声明和使用方法,之前的模板都是程序员自己根据自己的需求来设计的,从自己去声明这个模板的到最后去使用 模板都是自己完成的:而这些标准模板库并不是我们自己写的,而是一些大神们写的,因为他们在编程的过程中,经常会使用一些常用的模板,而每次 都需要去重复创建模板,久而久之,这些大神们就会将这些常用又很使用的模板做成一个模板库的形式,也就形成了现在使用的标准模板库STL.跟我 们的标准函数库一样,也

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

C++学习笔记——STL(标准模板库)

1.首先.需要学习C++ 模板的概念 2.C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. 3.C++ 标准模板库的核心包括以下三个组件: 组件 描述 容器(Containers) 容器是用来管理某一类对象的集合.C++ 提供了各种不同类型的容器,比如 deque.list.vector.map 等. 算法(Algorithms) 算法作用于容器.它们提供了执行各种操作的方式,

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n