STL学习2——序列容器

三种:vector,list,queue
基础:数组,链表,数组
支持函数:front,back,push_back,pop_back


vector

可以动态的改变它的大小,可以彼此赋值,但数组表示地址常量就没这功能。
vector就像数组一样,是连续的。在末尾插入非常高效,中间就不行。
要想经常在两端插入删除,最好用queue,它比vector好。
有对vector操作的函数也有它对应的迭代器。
1.vector和迭代器

1.size和capacity用法:

    vector<int> integers;

    cout << integers.size() << endl;//0
    cout << integers.capacity() << endl;//0

    integers.push_back(1);
    integers.push_back(2);
    integers.push_back(4);

    cout << integers.size() << endl;//3
    cout << integers.capacity() << endl;//4

原因:size是当前存放元素个数;capacity是成倍增长的,如:1,2,4,8,16,32…..这回造成空间浪费。所以,一般都手动初始化一个较大的容量。用resize和reserve控制空间。

2.使用迭代器遍历

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

template <typename T>  
void printVector(const vector<T> &);

----------
main:
{
    vector<int> integers;
    integers.push_back(1);
    integers.push_back(2);
    integers.push_back(4);

    printVector(integers);//调用迭代器输出函数
    cout << endl;
}
----------

template<typename T> 
void printVector(const vector<T> & interges)
{
    typename vector<T>::const_iterator constIterator;//定义一个常量迭代器,迭代vector<int>这个对象,并输出它的内容,const是使它不可以修改元素
    for (constIterator = interges.begin(); constIterator != interges.end(); ++constIterator)
    {
        cout << *constIterator;
    }
}//interges.begin()的返回值是一个迭代器(相当于指针)

3.使用迭代器反向遍历

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

template <typename T>  void RprintVector(const vector<T> &);

----------
main:
{
    vector<int> integers;
    integers.push_back(1);
    integers.push_back(2);
    integers.push_back(4);

    RprintVector(integers);
    cout << endl;
}
----------
template<typename T> void RprintVector(const vector<T> & interges)
{
    typename vector<T>::const_reverse_iterator rconstIterator;//const_reverse_iterator 反向迭代器
    for (rconstIterator = interges.rbegin(); rconstIterator != interges.rend(); ++rconstIterator)//rbegin,rend
    {
        cout << *rconstIterator;
    }
}

以上的iterator,const_iterator,const_reverse_iterator都属于常用的迭代器,一般的容器中都有这些。

2.操作vector的函数

1.初始化vector元素
指向数组的指针可以作为迭代器,实参是两个迭代器,从arry开始,到arry+size范围内所有元素(最后一个不包含)

int size=6;
int arry[size]={1,2,3,4,5,6};
vector<int> interges(arry,size+arry);

vector<int> interges={1,2,3};//初始化为1,2,3
vector<int> interges1(interges);//拷贝
vector<int> interges(10);//生成一个向量,且里有10个数,且初值为0;
vector<int> interges[10];//生成10组向量,每个向量的size为0

2.copy函数和ostream_iterator迭代器输出

定义输出迭代器对象output,它只输出int型变量,构造函数第一个实参指定输出流,第二个参数指定出输出值的分隔符;

copy过程,从第一个迭代器指定位置开始,到第二个结束(不包括那个位置的),把这些位置的元素都复制到后一个实参的输出迭代器中。

ostream_iterator<int> output(cout,' ');//ostream_iterator在头文件<iterator>中,output这个对象连接到了cout
copy(interges.begin(),interges.end(),output);//包含在<algorithm>中

3.front,back函数以及begin,end函数

front函数返回vector中第一个元素的引用;
begin函数返回一个随机访问迭代器,指向vector中第一个元素;

cout<<*interges.begin();
cout<<interges.front();

4.at函数

下标访问的功能,同时判断是否超出边界,若超出边界,at函数会抛出out_of_bounds异常。

integers.at(10);//这个异常在头文件<stdexpect>中。

5.insert函数

把第二个实参插到第一个实参中指定位置元素之前。
这里的迭代器指向vector的第二个元素,因此22就变成第二个元素了,其他的往后串。

integers.insert(interges.begin()+1,22);

6.erase函数

删除指定位置的元素,或者指定一段的元素

intergers.erase(integers.begin());
intergers.erase(integers.begin(),integers.end());

list


deque

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值