C++STL技术原理浅析与应用基础(一)
C++STL(c++标准库),又称泛型库,是一个以模板技术实现各种数据结构(容器),算法的通用程序库。包括三个部分:容器,迭代器,算法;容器有:vector(向量),deque(双端队列),list(双向链表)等;迭代器就是一组访问容器这些数据结构的指针,每个容器单独定自己的迭代器;算法包括sort(),for_each(),find()等。他们之间的关系为:算法使用迭代器访问容器。
我写本文的目的知识只是为了记录我的STL学习过程中的所想,所知,所感。加深自己对STL技术的理解,如果你有好的想法或者建议请联系我B3uHero@163.com,愿意与你共勉之。顺便说一句,把时髦的技术挂在嘴边,还不如把过时的技术记在心里,如果你已经决定了要看这篇文章,请保持一个虚心的态度,如果你不具备这条那就不用往下看了。
废话不多说了……进入正题…….
一. vector的技术原理与应用基础
vector是一种简单,高效的向量容器。在尾端插入和删除元素,时间复杂度为O(1),
其他位置的元素的插入和删除时间复杂度为O(n).
先来看看vector的数据结构
Vector定义了三个指针变量访问它的数据结构,M_start指向当前的起始字节的位置,M_finish指向最后一个vector元素的末尾字节处(就是最后一个元素的下一个元素),M_end_of_storage指向整个容器所占的内存空间的末尾字节处。
下面介绍vector容器的常用函数
begin()返回M_start指针,end()返回M_finish所以在区间[begin(),end()),就可以表示整个区间的所有值。
Vector提供的迭代器类型有:iterator,const_iterator,reverse_iterator,const_reverse_iterator四种后面程序中具现之。
1. empty()判断是否为空
2. size_typezise()返回当前vector中的实际的元素个数
3. size_typemax_size()返回标准库给vector允许分配的最大元素个数
4. size_typecapacity()返回当前可容纳的vector元素的个数
5. referencefront()返回当前vector首元素的引用,要求vector非空
6. referenceback()返回当前vector末尾元素的引用,要求vector非空
7. pop_back()用于从vector末尾删除元素与push_back()相反
注:vector没有push_front()和pop_front()要在任意位置插入元素用insert(iterator pos,int a)在pos前插入a。删除指定元素用erase(iteratorpos),删除指定区间的元素用erase(iterator first,iterator last)删除[first,last)区间的元素。Clear调用erase()删除[begin(),end())之间的所有元素,即清空vector。
以下代码是关于vector的简单实例:
#include <iostream>
#include<vector>
using namespace std;
/* run this program using the console pauser or addyour own getch, system("pause") or input loop */
int main(int argc, char** argv) {
vector<int>v; //定义vector
v.push_back(8); //放入数据
v.push_back(4);
v.push_back(7);
v.push_back(8);
v.push_back(0);
v.push_back(6);
v.push_back(5);
v.push_back(5);
v.push_back(7);
vector<int>::iteratori,iend;//定义vector迭代器
iend=v.end();
cout<<"vector容器元素为:"<<endl;
for(i=v.begin();i!=iend;i++)
{
cout<<*i<<endl;
}
vector<int>::reverse_iteratorri,riend;//定义vector反向迭代器
riend=v.rend();
cout<<"vector元素的反向迭代的结果为:"<<endl;
for(ri=v.rbegin();ri!=riend;ri++)
{
cout<<*ri<<endl;
}
//各种函数的应用
cout<<"首元素为:"<<v.front()<<endl;
cout<<"元素个数为:"<<v.size() <<endl;
cout<<"当前vector分配的空间为"<<v.capacity() <<endl;
cout<<"标准库给vector的空间为"<<v.max_size() <<endl;
v.pop_back();
cout<<"末尾元素为:"<<v.back()<<endl;
v.reserve(30);//自定义vector当前分配空间的大小
cout<<"从新分配空间后的大小为:"<<v.capacity() <<endl;
//swap
vector<int>v1;
v1.push_back(6);
swap(v1,v);
vector<int>::iteratori1,iend1;
iend1=v1.end();
cout<<"交换后的v1为:"<<endl;
for(i1=v1.begin();i1!=iend1;i1++)
{
cout<<*i1<<endl;
}
return 0;
}
总结一下,写的很水……只是简单的介绍了一下vector数据结构和基础函数应用。vector的基本函数的细节实现以及vector内存分配机制没有详细写,希望后面把vector的实现以及各种内存分配机制这一部分补上。