STL模板和容器

文中内容来自于程序员面试宝典,算是学习笔记

标准模板库(STL,standard Template Library)
一、STL有以下优点:
1.可以方便、容易地实现搜索数据或对数据排序等一系列的算法。
2.调试程序时更加安全和方便。
3.即使是人们用STL在UNIX平台下写的代码,你也可以很容易的理解(因为STL是跨平台的)。
二、STL中的一些基础概念的定义如下。
1.模板(Template)类(及结构等各种数据类型和函数)的宏(macro)。有时叫做甜饼切割机
(cookie cutter),正规的名称叫做泛型(generic)。一个类的模板叫做泛型类(generic
class),而一个函数的模板也自然的被叫做泛型函数(generic function).
2.STL标准模板库,一些聪明人写的模板,现在已成为每个人所使用的标准C++语言中的
一部分。
3.容器(container) 可容纳一些数据的模板类。STL中有vector、set、map、multimap
和deque等容器。
4.向量(Vector)基本数组模板,这是一个容器。
5.迭代器(iterator),又叫游标,它是一个指针,用来指向STL容器中的元素,也可以
指向其他的元素。
总之,标准模板库是一个基于模板的容器类库,包含链表、列表、队列和堆栈。标准
模板库还包含许多常用的算法,包括排序和查找。
标准模板库容器类有两种类型:顺序容器和关联容器。顺序容器提供对齐成员的顺序
访问和随机访问。关联容器则经过优化关键值访问他们的元素。所有STL容器类都在
namespace std中定义。

顺序容器包括:vector、list、deque
其中:只有vector和deque容器提供下面两种重要的运算集合:迭代器算术运算,
以及使用除了==和!=之外的关系操作符来比较两个迭代器(==和!=这两种关系运
算适用于所有容器)。
即vector和deque类型迭代器支持以下操作:
vector<int>::iterator iter;
iter±n
iter1±iter2以及>,>=,<,<=等操作。
例如,下面的语句用于计算vector对象vec的中点位置:
iter=vec.begin()+vec.size()/2;
另一方面,代码:
//copy elements from vec into ilist
list<int> lst(vec.begin(),vec.end);
lst.begin()+lst.size()/2; //error:no addition on list iterators
是错误的。list容器的迭代器既不支持算术运算(加法或减法),也不支持关系
运算(>,>=,<,<=),它只提供前置和后置的自增、自减运算以及相等(不等)运算。

C++使用一对迭代器标记迭代器范围,通常将它们命名为first和last,或begin和end,
其中first和begin指向迭代器的第一个元素,而last和end指向最后一个元素的下一个
位置。


为了定义一个容器类型的对象,必须先包含相关的头文件,即下列头文件之一:
#include<vector>
#include<list>
#include<deque>

例1:vector的实现

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

void print(vector<int>);

int main()
{
    vector<int>  vec;
    vec.push_back(1);            //在容器vec的尾部添加值为1的元素,返回void类型
    vec.push_back(2);
    print(vec);
    vector<int>::iterator p;  //迭代器的方式进行元素访问
    p=vec.begin();
    *p=3;
    *(p+1)=4;
    print(vec);
    int i=0;
    while(i<vec.size())
        cout<<vec[i++]<<" ";
    cout<<endl;
    vec.pop_back(); //删除容器vec的最后一个元素。返回void,pop_front()则删除
    print(vec);          //第一个(vector类型不支持这个操作),vec.erase(p)删除
    vec.push_back(5);//器p所指向的元素。另,vec.back()和vec.front()分
    vec.push_back(6);//返回容器的最后一个和第一个元素的引用,用于访问元素
    i=0;
    while(i<vec.size())
        cout<<vec[i++]<<" ";
    cout<<endl;
    vec[0]=100;  //利用下标访问元素,数组的方式(只适用于vector和deque容器)
    vec[1]=101;
    vec[2]=102;
    i=0;
    while(i<vec.size())
        cout<<vec[i++]<<" ";
    print(vec);
    return 0;
}

void print(vector<int> v)
{
    cout<<" vector size is:"<<v.size()<<endl;
    vector<int>::iterator p=v.begin();
}

运行结果为:

vector size is 2
vector size is 2
3 4

vector size is 1
3 5 6
100 101 102
vector size is 3

关键概念:容器中的元素都是副本
      在容器中添加元素时,系统是将元素值复制到容器里。类似地,使用
一段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原
始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被复
制的原值不会受到影响,反之亦然。namespace std中定义。

原文地址:https://www.cnblogs.com/fuxianfeng1988/p/3264832.html