C++之STL

3:介绍deque的框架。

一,什么是STL

STL是 Standard Template Library 的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。

二,STL内容

STL提供六大组件,彼此可以配套使用。
1,容器(containers): 各种数据结构,如:vector,list ,deque,set,map等。

2,算法(algorithms): 各种常用的算法,如:sort,swap,search等。

3,迭代器(iterators):扮演容器与算法之间的“粘合剂”,是所谓的“泛型指针”。所有的STL容器都 附带自己专属的迭代器。

4,仿函数(functions):行为类似函数,可作为算法的某种策略。一般的函数指针可视为狭义的仿函数。

5,配接器(adapters): 一种用来修饰容器或仿函数或迭代器接口的东西。

6,配置器(allocators): 负责空间配置和管理。

三,序列式容器的使用

(1) vector(动态数组)

vector的接口:http://www.cplusplus.com/reference/vector/vector/?kw=vector

void test_vector()
{
    vector<int> v; //创建一个vector对象
    v.push_back(1); //往vector内插入数据
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    //普通遍历
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << "";
    }
    //迭代器遍历vector
    vector<int>::iterator it = v.begin();
    while (it != v.end())
    {
        cout << *it <<" ";
        it++;
    }

    v.pop_back();//尾删数据

    vector<int>::iterator it = find(v.begin(), v.end(), 30);//先找插入位置
    v.insert(it, 10);

    it = find(v.begin(), v.end(), 30);//找要删除的位置
    v.erase(it);
}

(2)string (字符串)
string的接口:http://www.cplusplus.com/reference/string/string/?kw=string

void test_string()
{
    string s1("hello");//创建对象
    string s2 = "hello";

    string::iterator sit = s1.begin();//迭代器遍历
    while (sit != s1.end())
    {
        cout<<*sit<//普通遍历
    for (size_t i = 0 ; i < s1.size(); ++i)
    {
        cout<//使s1变成空串

    cout<'1'); //尾插一个字符
    s1.append("22222");//尾插一个字符串
    s1.pop_back();     //尾删一个字符
    cout<5, 1, "%%%");//将5这个位置上的一个字符替换成"%%%"
}

(3) list (带头双向循环链表)
list的接口:http://www.cplusplus.com/reference/list/list/?kw=list

void test_list()
{
    list<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    l.push_back(4);
    l.push_back(5);

    //迭代器遍历
    list<int>::const_iterator it = l.begin();
    while (it != l.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;

    l.reverse();//list的逆置

    l.pop_back();//尾删

    l.sort();//排序
    l.unique();//去重
}

(4)stack(栈)
stack的接口:http://www.cplusplus.com/reference/stack/stack/?kw=stack

void test_stack()
{
    stack<int> s;
    s.push(1);//入栈
    s.push(2);
    s.push(3);
    s.push(4);

    while (!s.empty())
    {
        cout << s.top() << " ";//取栈顶元素
        s.pop();//出栈
    }
    cout << endl;
}

(5) queue(队列)
queue的接口:http://www.cplusplus.com/reference/queue/queue/?kw=queue

void test_queue()
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);

    while (!q.empty())
    {
        cout << q.front() << " ";//取队头元素
        q.pop();//删除队头元素
    }
    cout << endl;
}

(6)deque(双端队列)
deque的接口:http://www.cplusplus.com/reference/deque/deque/?kw=deque

deque简介:

deque是一种双向开口的连续线性空间,可以在头和尾两端分别做元素的插入和删除操作。

deque底层结构

deque是一段假想的连续空间,与vector不同。deque由一段一段定量的连续空间
构成,一旦有必要再deque的前端或尾端增加新空间,便配置一段定量连续空间,
串接在整个deque的头端和尾端,而deque的任意就是:在分段的定量连续空间上
维护其连续的假象。

deque底层实现原理如图:
C++之STL_第1张图片

首先,创建一个中控器(数组),然后从中控器的中间开始,先动态开辟出一个buffer,使迭代器的first指向该buffer的首地址,last指向该buffer最后一个空间地址的下一个,每次尾插时,判断cur是否等于last,如果不等于,只需给cur指向的空间赋值,让cur向后走一步,如果等于,在动态开辟一个buffer,让迭代器的node 往后走一步,再给cur指向的空间赋值。 每次头插时,判断cur是否 等于first,如果不等于,只需给cur指向的空间赋值,让cur向前走一步,如果等于,再动态开辟一个buffer,让迭代器的node 往前走一步,再给cur指向的空间赋值。每次动态开辟buffer的大小是固定的。

你可能感兴趣的:(c++)