STL是什么?

   作为一个C++程序设计者,STL是一种不可忽视的技术。

   Standard Template Library(STL):标准的模板库,更准确的说是C++程序设计语言的标准模板库。STL是所有C++编译器和所有操作系统平台都支持的一种库。STL的使用者并不需要了解它的底层实现。它向程序员提了:

   1、  存储信息的容器

   2、访问容器存储信息的迭代器 

   3、操作容器内容的算法

为什么要学习STL?

   1、 STL提供了大量的可复用的软件组织。例如程序猿再也不用自己设计排序,搜索算法了,这些在STL中都已经实现了。

   2、使用STL的应用程序保证了得到的实现在处理素的和内存利用发面都是高效的 。

   3、 使用STL编写的代码更容易修改和阅读。

   下面就让我们一起来学习吧。。

  STL容器

   容器是用于存储数据的STL类,STL提供了两种类型的容器类:

   1、 顺序容器

     顾名思义,顺序容器按顺序存储数据,如数组和列表。顺序容器具有插入速度快但查找操作慢的性质。

     STL顺序容器包括:

     std::vector : 操作与动态数组一样,在最后插入数据

     std::deque :与上面的类型,但也允许在开头插入新元素

     std:list:操作和链表一样。 

   2、关联容器 

     关联容器按照指定的顺序存储数据,减低插入数据的速度,但是查找数据更方便。

     STL提供的关联容器包括:

  std::set : 按顺序排列的唯一值列表。 

     std::map:   存储键-值对,并更具唯一的键将键-值对排序

     std::multimap:     与set类型,但是允许存储多个值相同的项,即值不需要是唯一的

     std::multimap:    与map类似,但不要求键是唯一的。 

    如何根据实际情况选择正确的容器,下面是STL容器的特点:



STL迭代器

  最简单的迭代器就是指针,给定一个指向数据中的第一个元素的指针,可递增该指针使其指向下一个元素,可直接对当前位置的元素进行操作。STL容器总的迭代器是模板类,从某种程度上说,他们是泛型指针。这些模板类让程序员可以对STL容器进行操作。迭代器是容器和STL算法的一个桥梁。

  STL提供的迭代器分为两大类:

  1、输入迭代器: 通过对输入迭代器解除引用,它将饮用对象,而对象可能位于集合中,最严格的输入迭代器确保只能以只读的方式访问对象。

  2、输出迭代器: 输出迭代器让程序员对结合执行写入操作。最严格的的输出迭代器确保只能执行写入操作。

STL算法

 查找、排序和反转等是标准的编程需求,是最基本的要求。下面是常用的STL算法:

    std::find : 在容器中查找值

    std::find_if : 根据用户指定的情况在容器中查找值

    std::reverse : 反转容器中元素的排列顺序

    std::remove_if : 根据用户指定的条件,将元素从容器中删除

    std::transform :  使用用户定义的变换函数对容器中的元素进行变换。


下面来一个具体的例子了解STL使用

/*
 *operator_fun.cpp
 *cDate : 2013-11-09
 *Author: sjin
 *Mail:413977243@qq.com
 */
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//STL容器简单介绍
//顺序容器vector
int main()
{
    /*一个动态的整型数组*/
    vector <int> vecIntArray;

    vecIntArray.push_back(1988);
    vecIntArray.push_back(2);
    vecIntArray.push_back(20);
    vecIntArray.push_back(2013);
    vecIntArray.push_back(11);
    vecIntArray.push_back(2);

    cout << "动态数组的内容是:" << endl;

    vector <int>::iterator iArrayWalker = vecIntArray.begin();

    while ( iArrayWalker != vecIntArray.end() ){
        cout << *iArrayWalker << endl;
        ++ iArrayWalker;
    }

    //查找2013是否存在数组中,并打印在数组中的位置
    vector <int>::iterator iElement = find(vecIntArray.begin(),vecIntArray.end(),2013);

    if(iElement != vecIntArray.end()){
        int nPosition = distance(vecIntArray.begin(),iElement);
        cout << "Value " << *iElement;
        cout << "发现他在数组中的位置是:"<< nPosition << endl;
    }
    return 0;
}

 输出:

动态数组的内容是:
1988
2
20
2013
11
2
Value 2013发现他在数组中的位置是:3

后续将重点对各个容器进行讲解!
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐