STL学习总结之容器

STL介绍

STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。

STL组成构件

简单来说;
容器:类似数据结构,数组,链表,栈,队列等等。
算法:一些算法方式,一些排序算法,提供任何数据类型。
迭代器:将算法和容器进行链接。

STL 优点:高可重用性,高性能,高移植性,跨平台。

vector

图解:

这里写图片描述

介绍

它是单端数组,只能对该数组的一端进行插入和删除,他是一个动态数组,支持随机访问,存在自己的迭代器。

特点

vector 是动态数组,连续内存空间,具有随机存取效率高的优点。
vector 是单口容器,在队尾插入和删除元素效率高,在指定位置插入会导致数据元素移动,效率低。

应用例子

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
    vector<int> v;
    //插入元素10
    for (int i = 0; i < 10;i++)
       v.push_back(i);

    //得到容器的迭代器
    vector<int>::iterator it_begin = v.begin();
    vector<int>::iterator it_end = v.end();

    //遍历vector容器,将容器中的元素,输出
    for (vector<int>::iterator it=v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }

    vector<int>v1(v);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
    {
        cout << *it << endl;
    }
    cout << "v1.front():" << v1.front() << endl;
    cout << "v1.back():" << v1.back() << endl;
    cout << "v1[2]" << v1[2]<<endl;
    return 0;
}

deque

图解:

这里写图片描述

介绍:

它可以理解为一个双端数组,这个数组的两端都可以插入和弹出,支持随机访问,有自己的迭代器。

特点

双端插入和删除元素效率较高.
指定位置插入也会导致数据元素移动,降低效率.
可随机存取,效率高.

应用例子

#include<iostream>
#include<deque>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
    deque<int> q;
    q.push_front(3);
    q.push_back(5);
    q.push_front(11);
    for (deque<int>::iterator it = q.begin(); it != q.end(); it++)
    {
        cout << *it << endl;

    }
    cout <<"queue.at(2)"<<q.at(2) << endl;
    cout << "queue.front()"<<q.front() << endl;
    cout << "queue.back()"<<q.back() << endl;
    cout << "q[1]" << q[1] << endl;
    return 0;
}

stack

图解:

这里写图片描述

介绍:

stack 是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack 只允许在栈顶新增元素,移除元素,获得顶端元素,但是除了顶端之外,其他地方不允许存取元素,只有栈顶元素可以被外界使用,也就是说 stack 不能遍历,没有迭代器。

特点

栈不能遍历,不支持随机存取,只能通过 top 从栈顶获取和删除元素

应用例子

#include<iostream>
#include<stack>
#include<algorithm>
#include<functional>
using namespace std;

int main()
{
    stack<int>s;
    s.push(12);
    s.push(15);
    s.push(55);
    cout << "s.size()" << s.size() << endl;
    while (!s.empty())
    {
        cout << s.top() << endl;
        s.pop();
    }
    cout << "s.size()" << s.size() << endl;
    return 0;
}

queue

图解:

这里写图片描述

介绍:

queue 是一种先进先出(first in first out, FIFO)的数据类型,他有两个口,数据元素只能从一个口进,从另一个口出.队列只允许从队尾加入元素,队头删除元素,必须符合先进先出的原则,queue 和 stack 一样不具有遍历行为。

特定

必须从一个口数据元素入队,另一个口数据元素出队。
不能随机存取,不支持遍历

应用例子

#include<iostream>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;

int main()
{
    queue<int> q;y
    q.push(3);
    q.push(6);
    q.push(9);
    while (!q.empty())
    {
        cout << q.front() << endl;
        q.pop();
    }
    return 0;
}

list

图解:

这里写图片描述

介绍:

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

特点

采用动态存储分配,最大化利用内存
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
链表灵活,但是空间和时间额外耗费较大

应用例子

#include<iostream>
#include<list>
#include<algorithm>
#include<functional>
using namespace std;

int main()
{
    list<int> l;
    l.push_front(12);
    l.push_front(13);
    l.push_front(33);
    l.push_back(99);
    for (list<int>::iterator it = l.begin(); it != l.end(); it++)
    {
        cout << *it << endl;
    }
    cout << "l.size(3)=" << l.size() << endl;
    cout << "l.front()=" << l.front() << endl;
    cout << "l.back()=" << l.back() << endl;
    return 0;
}

set

介绍:

借用平衡二叉树的结构,来实现对数据的自动排序,set 容器中不允许重复元素,multiset 允许重复元素。

应用例子

#include<set>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
    set<int> s;
    s.insert(11);
    s.insert(1);
    s.insert(22);
    s.insert(66);
    s.insert(88);
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << endl;
    }
    set<int>::iterator lo = s.lower_bound(22);//返回第一个 key>=keyElem 元素的迭代器。
    set<int>::iterator up = s.upper_bound(22);//返回第一个 key>keyElem 元素的迭代器。
    pair<set<int>::iterator ,set<int>::iterator> equal =s.equal_range(22);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
    cout <<"*lo=" <<*lo << endl;
    cout << "*up=" << *up << endl;
    cout <<"*(equal.first)="<<*(equal.first) << endl;
    cout << "*(equal.second)=" << *(equal.second) << endl;
    return 0;
}

map

介绍:

map 相对于 set 区别,map 具有键值和实值,所有元素根据键值自动排序。pair 的第一元素被称为键值,第二元素被称为实值。map 也是以红黑树为底层实现机制。map 和 multimap 区别在于,map 不允许相同 key 值存在,multimap 则允许相同key 值存在。

应用例子

#include<map>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    map<int, int> m;
    m.insert(make_pair(1,1));
    m.insert(make_pair(2,2));
    m.insert(make_pair(3,3));
    for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
    {
        cout <<"it->first="<<it->first<<" ";
        cout << "it->second" << it->second << endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值