C++STL技术原理浅析与应用基础之vector

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的实现以及各种内存分配机制这一部分补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值