精华内容
下载资源
问答
  • STL标准模板库

    2017-11-08 10:51:55
    C++ STL 向量vector是一种随机访问的数组类型,提供了对数组元素的快速、随机访问以及在序列尾部快速、随机的插入和删除操作。它是大小可变的向量,在需要是可以改变其大小。 形式:
  • STL是Standard Template Library的简称,中文名标准模板库,是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室开发的 ,是一个具有工业强度的,高效的C++库,STL早已是ANSI/ISO C++标准中的一部分。STL...
  • STL的详细整理描述
  • STL标准模板库源码

    2017-08-22 23:02:32
    STL标准库源码全,如list、map、vector等。
  • 2020千锋_物联网_STL标准模板库深入浅出教程(通俗易懂)的源码和课件,方便各位参考b站视频进行学习!
  • C++ STL标准模板库

    2021-05-20 13:58:20
    标准模板库(STL)包含许多用于实现数据类型和算法的模板。STL 中最重要的数据结构是容器和迭代器。容器是一种存储数据并以某种方式组织数据的类。迭代器是一个像指针一样工作的对象,允许访问存储在容器中的项目。...

    除了运行时库之外,C++ 还提供了一个模板库。标准模板库(STL)包含许多用于实现数据类型和算法的模板。

    STL 中最重要的数据结构是容器和迭代器。容器是一种存储数据并以某种方式组织数据的类。迭代器是一个像指针一样工作的对象,允许访问存储在容器中的项目。

    顺序容器

    STL 中有两种类型的容器类:顺序容器和关联容器。顺序容器以序列的形式存储项目,这意味着按照项目在容器内的位置以自然方式排序项目。数组就是顺序容器的一个示例。

    STL提供了如表 1 所示的 3 个顺序容器。

    表 1 STL顺序容器

    容器名称

    描 述

    vector

    作为一个数组实现的一系列项目,在程序执行期间可以根据需要自动增长。项目可以高 效地从矢量末尾添加或删除。从矢量的中间或开始位置插入或删除项目的效率不高

    deque

    一系列具有头部和尾部的项目:项目可以有效地从头部和尾部添加或删除。在双端队列(deque)的中间插入和删除项目的效率都很低

    list

    允许从任意位置快速添加和删除的一系列项目

    因为顺序容器按顺序组织它存储的项目,所以可称它有一个头部和一个尾部。如果可以指定容器中某个项目的位置,然后直接跳转到该项目,而不必遍历容器中该项目之前的所有项目,则称该容器提供了对其内容的随机访问方式。

    随机访问中使用的位置通常是通过给定一个整数指定的,该整数指定了容器内所需项目的位置。该整数指定的位置可以相对于容器的头部、末尾或相对于其他位置。数组和矢量都是提供随机访问的顺序容器示例。

    关联容器

    顺序容器使用序列中的项目位置来访问其数据。相反,关联容器将一个键(Key)与存储的每个项目相关联,然后使用该键来检索存储的项目。电话簿是关联容器的一个示例,它存储的值是电话号码,每个电话号码都与一个名称相关联。该名称稍后可以用作查找或 检索电话号码的键。

    STL 提供了 4 个关联容器,如表 2 所示。

    表 2 STL关联容器

    容器名称

    描 述

    set

    存储一组键。不允许重复的值

    multiset

    存储一组键。允许重复的值

    map

    将一组键映射到数据元素。每个键都与唯一的数据元素相关联,并且不允许使用重复的键

    multimap

    将一组键映射到数据元素。相同的键可以关联多个值

    map 是一个容器,要求每个存储的值都与一个键相关联。每个键可能只与一个值相关 联。一旦使用了键,则不能将具有相同键的其他值添加到 map 中

    multimap 和 map 相似,只不过其键则可以关联多个值。

    set 和 map 类似,只不过它仅存储键,并不关联值。没有项目能在一个 set 中存储两次,也就是说,不允许重复项目。multiset 很像 set,只不过它允许重复。

    迭代器

    迭代器是像指针一样的对象。它们可用于访问存储在容器中的项目。典型的迭代器是在容器类中声明的类的对象。迭代器可以重载指针运算符,如递增运算符 ++、递减运算符 -- 和解引用运算符 * 等,以提供类似于指针的行为。

    每个 STL 容器对象都提供成员函数 begin() 和 end(),它们返回对象的开始和结束迭代器。如果容器是非空的,则 begin() 迭代器将指向容器开始处的项目,而 end() 迭代器则指向刚刚超过容器尾部的地方。

    表 3 显示了可用于各种 STL 容器的不同类型的迭代器。

    表 3 迭代器类型

    迭代器类型

    描 述

    前向(Forward)

    只能在容器中向前移动(使用++运算符)

    双向(Bidirectional)

    可以在容器中前后移动(使用++和一运算符)

    随机访问(Random-Access)

    可以在容器中前后移动,还可以直接跳转到指定的数据项目

    输入(Input)

    可以使用cin从输入设备或文件读取信息

    输出(Output)

    可以使用emit将信息写入输出设备或文件

    迭代器的使用

    每个STL容器类都定义了一个名为 iterator 的内部类,可用于创建迭代对象。示例如下:

    vector::iterator list::iterator

    以上示例都是内部类,可以相应为 vector 和 list 类型的容器提供迭代器。以下示例演示了如何为 int 类型的矢量和 string 列表定义迭代器,并将它们初始化为容器的开始位置。

    vector vect;

    list myList;

    vector::iterator vIter = vect.begin();

    list::iterator listIter = myList.begin();

    在 C++ 11 中,可以将迭代器的类型声明为 auto,这样编译器将从容器的类型推断出迭代器的正确类型,如下所示:

    auto vIter = vect.begin();

    auto listIter = myList.begin();

    除此之外,C++ 还提供了 begin(c) 和 end(c) 函数,当它们应用于 STL 容器 c 时,将相应返回 c.begin() 和 c.end() 迭代器。

    所以,上面的 2 个示例也可以改写为以下形式:

    auto vlter = begin(vect);

    auto listlter = begin(myList);

    begin(c) 和 end(c) 函数的好处是可以和数组一起使用。在某些情况下,这允许程序员编写能同时处理 STL 容器和数组的代码。

    迭代器可以像指针一样工作,指示容器内的位置。如果 iter 是一个迭代器,则 *iter 就代表了在容器的迭代器位置中存储的元素。此外,编写 iter++ 将导致迭代器向前移动到容器的下一个位置。end() 迭代器始终指示超过容器最后一个元素的位置,所以它绝对不能被解引用。end() 迭代器仅用作标记符号,以防止掉入容器的末尾。

    例如,以下代码将打印代码中的所有值:

    vector vect { 10, 20, 30, 40, 50};

    auto vIter = vect.begin();

    while (iter != vect.end())

    {

    //打印iter位置的元素并向前迭代

    cout << *iter << " ";

    iter ++;

    }

    下面的程序演示了如何使用上述概念知识来处理数组和矢量。它的主要思路是编写如下模板函数:

    template void print(T begin_iter, T end_iter)

    该函数釆用 T 类型形参。作为 T 传递的真实类型需要支持解引用运算符 * 和后缀递增运算符 ++。像这样的类型进入某些 STL 容器中可以作为迭代器,或者进入数组中作为指针。无论哪一种方式,都可以引用 T 作为迭代器类型。

    请注意,begin_iter 和 end_iter 指定了某些容器中的开头和末尾位置。递增运算符 ++ 知道如何从容器中的一个位置移动到下一个位置。因此,无须第三个形参即可指定容器本身。在下面程序的代码清单中可以看到 print 函数的代码。

    该程序的 main 函数演示了print函数的两种用法,其中一个用于 string 数组,另一个用于 int 类型的数组。

    // This program demonstrates how iterators and related concepts can be used to write code that works with arrays and STL containers.

    #include

    #include

    #include

    #include

    using namespace std;

    template

    void print(T begin_iter, T end_iter)

    {

    auto iter = begin_iter;

    while (iter != end_iter)

    {

    cout << *iter << ";

    iter++;

    }

    cout << endl;

    }

    int main()

    {

    // Print an array of strings

    string names[]{ "Anna", "Bob", "Chuck" };

    print(begin(names), end(names));

    // Print a vector of integers

    vector vec{ 10, 20, 30 };

    print(begin(vec), end(vec));

    return 0;

    }

    程序输出结果:

    Anna Bob Chuck

    10 20 30

    vector容器

    表 4 列出了矢量类模板的一些成员函数。其中一些接收迭代器作为形参,而另外一些则返回迭代器作为结果。

    表 4 vector 类的成员函数精选

    成员函数

    描 述

    at(position)

    返回矢量中position位置的元素的值。示例:

    x = vect.at(5);

    该语句可以将矢量中位置5的元素的值赋给变量x

    back()

    返回对矢量中最后一个元素的引用。示例:

    cout <

    begin()

    返回指向矢量第一个元素的迭代器。示例:

    iter = vect.begin();

    capacity ()

    返回在不分配额外内存的情况下,矢量中可以存储的元素的最大数量。它和 size 成员函数返回的值并不相同。示例:

    x = vect.capacity();

    该语句可以将矢量的容量值赋给变量 x

    clear()

    清除矢量中的所有元素。示例:

    vect.clear();

    该语句可以将 vect 矢量中的元素全部删除掉

    empty()

    如果矢量为空则返回 true,否则返回 false。示例:

    if (vect.empty())

    cout<< "The vector is empty.";

    end()

    返回指向矢量最后一个元素后面位置的迭代器。示例:

    iter = vect.end();

    erase(iter)

    导致迭代器 iter 指向的矢量元素被删除。示例:

    vect.erase(iter);

    erase(iterl, iter2)

    导致迭代器 iter1 和 iter2 指定的范围中的所有矢量元素都被删除。示例:

    vect.erase(iter1, iter2);

    front()

    返回对矢量中第一个元素的引用。示例:

    cout <

    insert(iter,value)

    将一个元素插入到矢量中。示例:

    vect.insert(iter, x);

    该语句可以将值 x 插入到由迭代器 iter 指向的元素的前面

    insert(iter, n,value)

    将 value 的 n 个副本插入到矢量中。插入的位置就在由迭代器 iter 指向的位置前面。 示例:

    vect.insert(iter, 7, x);

    该语句可以将值 x 的 7 个副本插入到由迭代器 iter 指向的元素前面

    pop_back()

    从矢量中删除最后一个元素。示例:

    vect.pop back();

    该语句可以将 vect 矢量的最后一个元素删除掉,这也意味着其大小会被减去 1

    push_back(value)

    将 value 存储为矢量最后一个元素的新值。如果该矢量的容量已经被填满,那么它会自动调整大小。示例:

    vect.push back(7);

    该语句可以将 vect 矢量最后一个元素的值存储为 7

    reverse()

    反转矢量中元素的顺序。最后一个元素变成第一个元素,而第一个元素则变成最后 一个元素。示例:

    vect.reverse();.

    resize(n) resize(n,value)

    调整矢量的大小,使它拥有 n 个元素,其中 n 大于矢量的当前大小。如果包含了可选的 value 参数,则每个新元素都将使用该值进行初始化。示例,假设 vect 矢量当 前包含 4 个元素:

    vect.resize(6,99);

    该语句可以给矢量添加 2 个元素,并且每个新元素都将被初始化为 99

    size()

    返回 vector 矢量中元素的个数。示例:

    cout <

    swap(vector2)

    将当前矢量的内容和 vectors 矢量的内容交换。示例:

    vectl.swap(vect2);

    该语句可以交换矢量 vect1 和 vect2 的内容

    算法

    STL 提供的算法被实现为函数模板,并可对容器的元素执行各种操作。在 STL 中有很多算法,表 5 仅列出了其中的很少一部分(该表仅给出了一般说明)。

    表 5 STL算法

    算 法

    描 述

    binary_search

    对某个对象执行二分搜索,如果找到对象则返回 true,否则返回 false。示例:

    binary search(iter1, iter2, value);

    在该语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一个 元素,iter2 指向范围中最后一个元素之后)。语句对元素范围执行二分搜索,搜索 value。binary_search 函数在找到元素的情况下返回 true,如果未找到元素则返回 false

    count

    返回一个值出现在一个范围内的次数。示例:

    number = count(iter1, iter2, value);

    在该语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一个 元素,iter2 指向范围中最后一个元素之后)。该语句返回 value 出现在元素范围内的次数

    for_each

    为容器中的每个元素执行一个函数。示例:

    for each(iter1, iter2, func);

    在这个语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一 个元素,iter2 指向范围中的最后一个元素之后)。第 3 个参数 func 是函数的名称。 该语句为范围中的每个元素调用函数 func,将该元素作为参数传递

    find

    在容器中查找匹配值的第一个对象并返回一个迭代器。示例:

    iter3 = find(iter1, iter2, value);

    在该语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一个 元素,iter2 指向范围中最后一个元素之后)。语句在元素范围内搜索 value。如果找到了该值,则函数将返回一个迭代器到包含它的元素,否则返回迭代器 iter2

    max_element

    返回范围中最大对象的迭代器。示例:

    iter3 = max element(iter1, iter2);

    在该语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一个 元素,iter2 指向范围中最后一个元素之后)。该语句返回范围中包含最大值的元素的迭代器

    min_element

    返回范围中最小对象的迭代器。示例:

    iter3 = min element(iter1, iter2);

    在该语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一个 元素,iter2 指向范围中最后一个元素之后)。该语句返回范围中包含最小值的元素的迭代器

    random_shuffle

    随机重排容器中的元素。示例:

    random shuffle(iter1, iter2);

    在这个语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一 个元素,iter2 指向范围中最后一个元素之后)。该语句可随机地重新排列范围中的元素

    sort

    对某个范围中的元素进行排序。示例:

    sort (iter1, iter2);

    在这个语句中,iter1 和 iter2 定义了容器中的元素范围(iter1 指向范围中的第一 个元素,iter2 指向范围中最后一个元素之后)。该语句将按升序对范围中的元素进行排序。

    注意,STL 算法需要包含 algorithm 头文件才能使用。

    展开全文
  • STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库中,是ANSI/ISO C++标准中新的也是极具革命性的一部分。 STL将数据结构和算法的分离,使得STL变...
  • STL标准模板库pdf.rar

    2020-06-10 14:20:40
    C++的STL类库在刷leetcode这些网站的题目时,还是很有用的。如果想刷题,不妨看一下这方面的内容,当然这里的文件不适合已经入门的人,毕竟太初级了。接触过的同学可以自己去找源码,自己钻磨源码会有更深的体会。
  • C++_标准模板库(STL) pdf 高清版 C++ 标准模板库(STL)
  • C++语言STL标准模板库 中文教程.zip
  • stl 标准模板库

    2012-04-30 10:08:41
    标准模板库的一些基本介绍,以及标准模板库的使用,有程序例子的介绍。
  • 标准模板库STL的使用 实验报告.docx
  • C++STL标准模板库详解.ppt
  • C++ 的标准模板库(Standard Template Library,STL)是泛型程序设计最成功应用的实例。 STL 是一些常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板的结合,主要由 Alex Stepanov ...
  • • 容器container:可容纳各种数据类型的数据结构。 • 迭代器:可依次存取容器中元素的东西 • 算法:用来操作容器中的元素的函数模板
  • STL标准模板库的例子

    2012-02-03 09:20:21
    STL标准模板库(standard template library) 容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类) 容器可以直接存储对象,也可以存储对象的指针。成熟的程序员喜欢使用间接...
  • STL标准模板库笔记

    2015-01-07 18:13:28
    该文档是对C++中的标准模板库的总结,包括顺序容器,关联容器,适配器等等。是比较详尽的总结。
  • STL是C++最重要的支持,安全高效。泛型编程可以将C++程序的执行效率进一步增强,而且极大简化了代码冗余。学些C++必备书籍。
  • STL 标准模板库简介

    2013-07-02 18:39:37
    STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list, vector,set,map等,STL也是算法和其它一些组件的...
  • STL标准模板库 ACM

    2010-06-01 12:16:21
    STL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分。STL以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程序员如果能够充分地利用STL,可以在代码空间、执行时间和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,876
精华内容 15,950
关键字:

stl标准模板库

友情链接: problem2.zip