17-Vector_Deque_Stack学习笔记

STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一
系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室
工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有
list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指
的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以
使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。
STL的版本很多,常见的有HP STL、PJ STL、SGI STL等。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、
<functional>、<iterator>、<vector>、<list>、<map>、<memory.h>、<numeric>.
<queue>、<set>、<stack>和<utility>. 

一、STL(vector)

1、序列式容器vector: 向量(vector) 连续存储的元素<vector>
vector 容器是 STL 中最常用的容器之一,它和array容器非常类似,都可以看做是对
C++普通数组的“升级版”。不同之处在于,array实现的是静态数组(容量固定的数组),
而vector实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector会动
态调整所占用的内存空间,整个过程无需人工干预。
vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就
可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长
一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。 

2、【创建vector容器方式]

#include <iostream>
#include<vector>
using namespace std:
int main()
{
    //创建了一个v1的空容器  数据类型是double
    vector<double> v1;

    //创建容器的时候,给他赋值,然后初始化了元素的个数
    vector<int> v2{34,65,78,90,28,56,98,77,81,18}
    
    //创建容器,指定了元素个数 
    vector<int> v3(50);
    
    //创建vector容器,他拥有10个字符为“A”
    vector<char> v4(10,'A');

    //将v4赋给v5
    vector<char> v5(v4);

    //v6将会保存1,2
    int a[] = {1,2,3};
    vector<int> v6(a,a+2);

    //v8将会保存1,2,3
    vector<int> v7{1,2,3,4,5,6,7,8,9,10};
    vector<int> v8(begin(v7),begin(v7)+3);
    
    return 0;
}

实战练习

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    //定义一个空的vector容器
    vector<char> vi;
    
    //向容器添加S T L T E M P L A T E
    vi.push_back('S');
    vi.push_back('T');
    vi.push_back('L');
    vi.push_back('T');
    vi.push_back('E');
    
    //输出容器vi元素个数size()
    cout<<"元素个数为:"<<vi.size()<<endl;

    //迭代器实现输出所有元素
    vector<char>::iterator it;
    for (it = vi.begin(); it != vi.end(); it++)
        cout << " " << *it;
        cout << endl;

    //遍历容器
    for(auto int i = vi.begin();i<vi.end();i++)//auto自动返回迭代器类型,减少代码量
        cout<<""<<*i<<"";
        cout<<endl;

    //插入元素到头部
    vi.insert(vi.begin(),'v');//这里为什么不可以用双引号?欢迎评论
    
    //插入元素到尾部
    vi.insert(vi.end(),'I');

    //输出首个元素
    cout<<"输出vi容器首个元素为"<<vi.at(0)<<endl<<endl;



    return 0;

}


3、 【vector容器包含的成员函数]
[直接对应官方网站查询即可]
http://www.cplusplus.com/reference/vector/vector/ 


二、STL(deque)

1、deque 是 double-ended queue 的缩写,又称双端队列容器。
前面已接触过vector容器,值得一提的是,deque容器和vecotr容器有很多相似之
处,比如:deque容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在
序列中间添加或删除元素。deque容器也可以根据需要修改自身的容量和大小。
和vector 不同的是,deque还擅长在序列头部添加或删除元素,所耗费的时间复杂度
也为常数阶O(1)。并且更重要的一点是,deque容器中存储元素并不能保证所有元素都存储到
连续的内存空间中。
当需要向序列两端频繁的添加或删除元素时,应首选deque容器。 

2、【创建vector容器方式] 

#include <iostream>
#include <deque>
using namespace std;

int main()
{
    //创建deque容器,没有任何数据元素
    deque<int> d1;
    
    //创建deque容器,且有50个元素
    deque<int> d2(50);
    
    //创建deque容器,有9个元素,并进行初始化赋值为88
    deque<int> d3(9,88);
    
    //容器之间可以赋值
    deque<int> d4(10);
    deque<int> d5(d4);
    return 0;
}

实战练习

#include <iostream>
#include <deque>
using namespace std;

int main()
{
    //定义空的容器
    deque<int> d1;
    
    //向容器尾部插入数字
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);
    d1.push_back(40);
    d1.push_back(50);
    d1.push_back(60);
    
    //输出d1元素个数
    cout<<"输出d1元素个数:"<<d1.size<<endl;

    //向d1容器头部添加元素
    d1.push_front(888);

    //输出容器所有元素值
    cout<<"输出d1容器所有元素的值:"<<endl;
    for(auto i = d1.begin();i<d1.end();i++)
        cout<<""<<*i<<"";
        cout<<endl;
    
    //删除元素10(容器头部数据元素值)
    d1.pop_front();
    

    return 0;
}


三、STL(stack)

容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些
不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。
stack<T>容器适配器中的数据是以LIFO(后进先出)的方式组织的,这和自助餐馆中堆叠的盘子、箱
子中的一堆书类似。理论上的stack容器及其一些基本操作。只能访问stack顶部的元素;只有
在移除stack 顶部的元素后,才能访问下方的元素。 

举例说明

// stack::swap
#include <iostream>       // std::cout
#include <stack>          // std::stack
using namespace std;


int main ()
{
    //创建一个stack容器适配器
    list<int>ls{10,20,30};
    stack<int,list<int>>mystack(ls);
    
    //查询mystack存储元素的个数
    cout<<"mystack栈容器数据元素个数:"mystack.size()<<endl;
    
    //输出栈容器元素的值:
    while(!mystack.empty())//没有元素返回真,否则返回false
    {
        cout<<mystack.top()<<"";
        //栈顶元素弹出去
        mystack.pop();
}
  std::stack<int> foo,bar;
  foo.push (10); foo.push(20); foo.push(30);
  bar.push (111); bar.push(222);

  foo.swap(bar);

  std::cout << "size of foo: " << foo.size() << '\n';
  std::cout << "size of bar: " << bar.size() << '\n';

  return 0;
}

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值