C++学习笔记43:STL

STL简介(standard Template Library)

STL的基本组件:容器(container),迭代器(iterator),函数对象(function object)

算法(algorithms)

Iterators是算法和容器的桥梁

将迭代器作为算法的参数,通过迭代器来访问容器而不是把容器直接作为算法的参数;

将函数对象作为算法的参数而不是将函数所执行的运算作为算法的一部分;

使用STL中提供的或者自定义的迭代器和函数对象,配合STL算法,可以组合出各种各样的功能;

容器

  概念:容纳、包含一组元素的对象

  基本容器类模板:

    顺序容器:array(数组),vector(向量),deque(双端队列),forward_list(单链表),list(列表)

    (有序)关联容器:set(集合),multiset(多重集合),map(映射),multiple(多重映射)

  无序关联容器:

    unordered_set, unordered_multiset,unodered_map,unordered_multimap

容器适配器

  stack(栈)

  queue(队列)

  priority_queue(优先队列)

注意:添加相应的头文件

STL的基本组件---迭代器(iterator)

  1. 提供了一种顺序访问容器中每个元素的方法
  2. 可以使用++运算符来获得指向下一个元素的迭代器
  3. 可以使用*运算符访问迭代器所指向的元素,如果元素类型是类或者结构体,可以使用->运算符直接访问该元素的一个成员;
  4. 有些迭代器还支持--运算符获得指向上一个元素的迭代器
  5. 迭代器是泛化的指针,指针也具有同样的特性,因此指针本身就是一种迭代器
  6. 使用独立于STL的迭代器,需要包含头文件<iterator>

STL的基本组件---函数对象(function object)

  1. 一个行为类似函数的对象,对它可像调用函数一样调用
  2. 函数对象是泛化的函数:任何普通的函数和任何重载了“()”运算符的类的对象都可以作为函数对象使用
  3. 使用STL的函数对象,需要包含头文件<functional>

STL的基本组件---算法(algorithm)

  1. 可以广泛用于不同对象和内置的数据类型
  2. STL包括70多个算法(排序,消除算法,计数算法,比较算法,变换算法,置换算法,容器管理等)
  3. 使用STL的算法,需要包含头文件<algorithm>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    const int N = 5;
    vector<int> s(N);//容器
    for (int i = 0; i < N; i++)
    {
        cin >> s[i];
    }

    /*
    算法:取相反数后输出;ostream_iterator<int>(cout, " "):输出流迭代器
    negate<int>() 取相反数的函数;
    transform算法的一种实现:
    transform算法顺序遍历first和last两个迭代器所指向的元素;
    将每个元素的值作为函数对象op的参数;
    将op的返回值通过迭代器result顺序输出;
    遍历完成后result迭代器指向的是输出的最后一个元素的下一个位置,transform会将该迭代器返回;
    template <class InputIterator, class OutputIterator, class UnaryFunction>
    OutputIterator transform(InputIterator first, InputIterator last, OutputItertor result,UnaryFunction op)
    {
    for(;first!=last;++first,++result)
    *result = op(*first);
    return result;
    }
    */
    transform(s.begin(), s.end(), ostream_iterator<int>(cout, " "), negate<int>());
    cout << endl;
    return 0;
}
时间: 2024-10-12 08:12:36

C++学习笔记43:STL的相关文章

STL学习笔记--&gt;初识STL

“这里要用char类型”; “这里要用int类型”; “其实实现这个方法只需要把另一个方法的返回值的类型和传入参数的类型改成float类型就实现了”; “其实这个算法只需要把以前写的那个稍微改动一下就行了”; ……………… 学过面向对象语言的都知道GP这个概念,就是泛型程序设计,说的再明白点就是编写不依赖于具体数据类型的程序,C++作为一门面向对象语言,当然也有泛型这个概念,这就不得不提STL(Standard Template Library,标准模板库),是被融入C++标准程序库里面的一个高

C++ 学习笔记之 STL 队列

一.  引言 在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则). 为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错. 好在C++的STL(标准模板库)为我们实现了一个强大的队列,它包含在头文件<queue>中. 二.    queue a)     构造函数 下面用例子来展示queue的构造函数 deque<int> deck(3,100); list<int> mylist(2,100); queue&l

C++学习笔记之STL标准库(二)algorithm头文件即算法

#include <algorithm> algorithm头文件中主要包含的是一大堆模板函数,即STL库提供的算法,可以认为每个函数在很大程度上是独立的.提供的算法种类有: 1)adjacent_find //检测区间内第一对相等的相邻元素 template<class FwIt> FwIt adjacent_find(FwdIt first,FwdIt last);   //如果成功,返回first+N,N满足*(first+N) == *(first+N+1):如果不存在相等

Scala中结构类型实战详解之Scala学习笔记-43

package com.leegh.parameterization /** * @author Guohui Li */ class Structural { def open() = print("A class instance Opened") } object Structural_Type { def main(args: Array[String]): Unit = { init(new { def open() = println("Opened")

Android学习笔记(43):Java开发SQLite程序

正如前面一文说的,SQLite多用于嵌入式开发中,但有时为了更方便的编辑数据库文件,我们也常常需要开发在电脑上运行的SQLite程序.这种情况是经常发生的,比如在我们需要把一大批的txt文件中的数据插入到一个数据库中的时候. 还好这是很简单的,所以本文我们来学习如何用Java开发SQLite程序. (1)准备工作 下载sqlite-jdbc-版本号.jar文件,放到jre\lib\ext文件夹.如我的路径是C:\Program Files\Java\jre1.8.0_77\lib\ext. (2

Java学习笔记43(打印流、IO流工具类简单介绍)

打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(OutputStream) PringWriter:构造方法:接收File类型,接收字符串文件名,接收字节输出流(OutputStream),接收字符输出流(Writer) 为其他流添加功能,可以方便地打印各种数据值,不同的是:它永远不会抛出IO异常 方法: package demo; import java

C++学习笔记之STL标准库(四)list

模板类list是一个容器,所控制的长度N的序列是一个有着N个节点的双向链表.每个节点存储一个单独的元素,一个前驱指针,一个后继指针.list的节点存储在非连续的存储空间中,由于其结构的原因,list的插入.删除.替换等操作速度很快,但元素的查找和随机存取等操作就很慢,需要从头节点一个节点一个节点的往下查找. 包含头文件 #include<list>  声明命名空间 using namespace std; 1)构造函数 list(); //声明一个空的列表,如:list<int>

C++学习笔记之STL标准库(六)set/multiset 关联容器

包含头文件 #include <set>  声明命名空间using namespace std; set/multiset是关联容器的一种,它们会对存储的元素进行自动排序,存储元素的值不能直接的被改变,只能通过删除旧值,再插入新值的方式达到更改元素值的目的.set不允许元素的值有重复,而multiset允许有重复的元素,这是他们的唯一区别.关联容器set, multiset以及后面的map, multimap内部采用的是一种非常高效的平衡检索二叉树:红黑树. 1)构造函数 set(); //创

C++学习笔记之STL标准库(八)queue容器适配器

容器适配器并没有直接维护被控序列,而是通过它里面存储的底层容器对象来实现所有的功能. queue类允许在底层数据结构的末尾插入元素,也允许从前面插入元素(先入先出). 包含头文件 #include<queue>  声明命名空间 using namespace std; 常见的queue操作: 1.void push(const T& val); //在队列末尾插入元素(通过调用底层容器的push_back函数实现) 2.void pop(); //在队列前面删除元素(通过调用底层容器的