您的位置:首页 > 其它

STL学习2——序列容器

2016-10-19 19:06 197 查看
三种: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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl