vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的偏移方式访问,和常规数组不一样的是,vector能够自动存储元素,可以自动增长或缩小存储空间,

vector的优点:

1.       可以使用下标访问个别的元素

2.       迭代器可以按照不同的方式遍历容器

3.       可以在容器的末尾增加或删除元素

和数组相比,虽然容器在自动处理容量的大小时会消耗更多的内存,但是容器能提供和数组一样的性能,而且能很好的调整存储空间大小

和其他标准的顺序容器相比(deques or lists),能更有效访问容器内的元素和在末尾添加和删除元素,在其他位置添加和删除元素,vector则不及其他顺序容器,在迭代器和引用也不比lists支持的好

容器的大小和容器的容量是有区别的,大小是指元素的个数,容量是分配的内存大小,容量一般等于或大于容器的大小,vector::size()返回容器的大小,vector::capacity()返回容量值,容量多于容器大小的部分用于以防容器的增加使用,每次重新分配内存都会很影响程序的性能,所以一般分配的容量大于容器的大小,若要自己指定分配的容量的大小,则可以使用vector::reserve(),但是规定的值要大于size()值,

1.构造和复制构造函数

explicit vector ( const Allocator& = Allocator() );

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

template <class InputIterator>

vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

vector ( const vector<T,Allocator>& x );

explicit:是防止隐式转换, Allocator是一种内存分配模式,一般是使用默认的

vector<int> A;  //创建一个空的的容器

vector<int> B(10,100); //创建一个个元素,每个元素值为

vector<int> C(B.begin(),B.end()); //使用迭代器,可以取部分元素创建一个新的容器

vector<int> D(C); //复制构造函数,创建一个完全一样的容器

2.析构函数

~vector()

销毁容器对象并回收了所有分配的内存

3.重载了=符号

vector<int> E;

E = B; //使用=符号

B = vector<int>(); //将B置为空容器

4. vector::begin()  返回第一个元素的迭代器

函数原型:

iterator begin ();  //返回一个可变迭代器

const_iterator begin () const; //返回一个常量的迭代器,不可变

5.vector::end()  返回的是越界后的第一个位置,也就是最后一个元素的下一个位置

iterator end ();

const_iterator end () const;

6.vector::rbegin() 反序的第一个元素,也就是正序最后一个元素

reverse_iterator rbegin();

const_reverse_iterator rbegin() const;

7.vector::rend() 反序的最后一个元素下一个位置,也相当于正序的第一个元素前一个位置

reverse_iterator rend();

const_reverse_iterator rend() const;

和vector::end()原理一样

8.vector::size() 返回容器中元素个数

size_type size() const;

注意与vector::capacity()的区别

9.vector::max_size()

size_type max_size () const;

返回容器的最大可以存储的元素个数,这是个极限,当容器扩展到这个最大值时就不能再自动增大

10. vector::resize()

void resize ( size_type sz, T c = T() );

重新分配容器的元素个数,这个还可以改容器的容量,如果重新分配的元素个数比原来的小,将截断序列,后面的部分丢弃,如果大于原来的个数,后面的值是c的值,默认为0

11. vector::capacity()

size_type capacity () const;

返回vector的实际存储空间的大小,这个一般大于或等于vector元素个数,注意与size()函数的区别

12. vector::empty()

bool empty () const;

当元素个数为0时返回true,否则为false,根据的是元素个数而不是容器的存储空间的大小

13. vector::reserve()

void reserve ( size_type n );

重新分配空间的大小,不过这个n值要比原来的capacity()返回的值大,不然存储空间保持不变,n值要比原来的实际存储空间大才能重新分配空间,但是最大值不可以大于max_size的值,否则会抛出异常

14. vector::operator[]  //重载了[]符号

reference  operator[] ( size_type n );

const_reference  operator[] ( size_type n ) const;

实现了下标访问元素

15. vector::at()

const_reference at ( size_type n ) const;

reference at ( size_type n );

在函数的操作方面和下标访问元素一样,不同的是当这个函数越界时会抛出一个异常out_of_range

16. vector::front()

reference front ( );

const_reference front ( ) const;

返回第一个元素的值,与begin()函数有区别,begin()函数返回的是第一个元素的迭代器

17. vector::back()

reference back ( );

const_reference back ( ) const;

同样,返回最后一个元素的值,注意与end()函数的区别

18. vector::assign()

template <class InputIterator> void assign ( InputIterator first, InputIterator last );

void assign ( size_type n, const T& u );

将丢弃原来的元素然后重新分配元素,第一个函数是使用迭代器,第二个函数是使用n个元素,每个元素的值为u。

19. vector::push_back()

void push_back ( const T& x );

在容器的最后一个位置插入元素x,如果size值大于capacity值,则将重新分配空间

20. vector::pop_back()

void pop_back ( );

删除最后一个元素

21. vector::insert()

iterator insert ( iterator position, const T& x );

void insert ( iterator position, size_type n, const T& x );

template <class InputIterator>

void insert ( iterator position, InputIterator first, InputIterator last );

插入新的元素,

第一个函数,在迭代器指定的位置前插入值为x的元素

第二个函数,在迭代器指定的位置前插入n个值为x的元素

第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last

若插入新的元素后总得元素个数大于capacity,则重新分配空间

22. vector::erase()

iterator erase ( iterator position );

iterator erase ( iterator first, iterator last );

删除元素或一段序列

23. vector::swap()

void swap ( vector<T,Allocator>& vec );

交换这两个容器的内容,这涉及到存储空间的重新分配

24. vector::clear()

void clear ( );

将容器里的内容清空,size值为0,但是存储空间没有改变

#include <vector>
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{ //构造函数,复制构造函数(元素类型要一致),
vector<int> A; //创建一个空的的容器
vector<int> B(10,100); //创建一个10个元素,每个元素值为100
vector<int> C(B.begin(),B.end()); //使用迭代器,可以取部分元素创建一个新的容器
vector<int> D(C); //复制构造函数,创建一个完全一样的容器 //重载=
vector<int> E;
E = B; //vector::begin(),返回的是迭代器 vector<int> F(10); //创建一个有10个元素的容器
for (int i = 0; i < 10; i++)
{
F[i] = i;
} /*
vector<int> F; //创建一个空容器
for (int i = 0; i < 10; i++)
{
F.push_back(i);
}
*/ vector<int>::iterator BeginIter = F.begin();
cout << *BeginIter << endl; //输出0 //vector::end() 返回迭代器
vector<int>::iterator EndIter = F.end();
EndIter--; //向后移一个位置
cout << *EndIter << endl; //输出9 //vector::rbegin() 返回倒序的第一个元素,相当于最后一个元素
vector<int>::reverse_iterator ReverBeIter = F.rbegin();
cout << *ReverBeIter << endl; //输出9 //vector::rend() 反序的最后一个元素下一个位置,也相当于正序的第一个元素前一个位置
vector<int>::reverse_iterator ReverEnIter = F.rend();
ReverEnIter--;
cout << *ReverEnIter << endl; //输出0 //vector::size() 返回元素的个数
cout << F.size() << endl; //输出10 //vector::max_size()
cout << F.max_size() << endl; //输出1073741823,这个是极限元素个数 //vector::resize()
cout << F.size() << endl; //输出10
F.resize(5);
for(int k = 0; k < F.size(); k++)
cout << F[k] << " "; //输出 0 1 2 3 4
cout << endl; //vector::capacity()
cout << F.size() << endl; //5
cout << F.capacity() << endl; //10 //vector::empty()
B.resize(0);
cout << B.size() << endl; //0
cout << B.capacity() << endl; //10
cout << B.empty() << endl; //true //vector::reserve() //重新分配存储空间大小
cout << C.capacity() << endl; //10
C.reserve(4);
cout << C.capacity() << endl; //10
C.reserve(14);
cout << C.capacity() << endl; //14 //vector::operator []
cout << F[0] << endl; //第一个元素是0 //vector::at()
try
{
cout << "F.size = " << F.size() << endl; //5
cout << F.at(6) << endl; //抛出异常
}
catch(out_of_range)
{
cout << "at()访问越界" << endl;
} //vector::front() 返回第一个元素的值
cout << F.front() << endl; //0 //vector::back()
cout << F.back() << endl; //4 //vector::assign()
cout << A.size() << endl; //0
vector<int>::iterator First = C.begin();
vector<int>::iterator End = C.end()-2;
A.assign(First,End);
cout << A.size() << endl; //8
cout << A.capacity() << endl; //8 A.assign(5,3); //将丢弃原来的所有元素然后重新赋值
cout << A.size() << endl; //5
cout << A.capacity() << endl; //8 //vector::push_back()
cout << *(F.end()-1) << endl; //4
F.push_back(100);
cout << *(F.end()-1) << endl; //100 //vector::pop_back()
cout << *(F.end()-1) << endl; //100
F.pop_back();
cout << *(F.end()-1) << endl; //4 //vector::swap()
F.swap(D); //交换这两个容器的内容
for(int f = 0; f < F.size(); f++)
cout << F[f] << " ";
cout << endl;
for (int d = 0; d < D.size(); d++)
cout << D[d] << " ";
cout << endl;
//vector::clear()
F.clear();
cout << F.size() << endl; //0
cout << F.capacity() << endl; //10 return 0;
}

vector函数用法的更多相关文章

  1. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  2. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

  3. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  4. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  5. memcpy函数用法

    memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...

  6. Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  7. php中opendir函数用法实例

    这篇文章主要介绍了php中opendir函数用法,以实例形式详细讲述了opendir函数打开目录的用法及相关的注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例分析了php中opendi ...

  8. assert()函数用法总结

    assert()函数用法总结 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> ...

  9. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

随机推荐

  1. easyui框架中关于dialog自带关闭事件的使用

    easyui是一个开源的第三方控件库,虽然使用比较方便,但其中有些事件和样式会与其他的控件或者框架形成冲突. 今天谈一下easyui 中dialog这个控件(对话框) easyui dialog一般在 ...

  2. IIS错误HTTP 错误 500.21 - Internal Server Error

    原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:以管理员身份运行cmd->输入“%windir%\Microsoft.NET\Framewo ...

  3. JavaSE_3_面向对象

    1.wait方法底层原理 wait是object中的方法,可以暂停线程,会释放对象锁,不像sleep方法,线程休眠期依然持有锁,通过调用notify或notifyAll方法唤醒线程. lock.wai ...

  4. 给类型为text的input设置value值却无法修改

    给类型为text的input设置value值后就无法修改了 我的页面显示为如下但是退格却无法改变他的值 原来是缺少onChange事件,没法监听value的改变 所以需要添加 onChange={th ...

  5. 【MFC】获取文件大小的方法

    [转载]原文地址:http://blog.csdn.net/coderwu/article/details/5652056 MFC 下可以通过 CFileStatus 获取文件大小. ULONGLON ...

  6. python数据类型、输入输出、运算符、条件判断、循环

    变量以及类型 变量:存储程序运行中的数据,变量有3个要素:变量名.变量类型.变量值.python属于弱类型语言,不需要声明变量类型. [root@localhost python]# ipython3 ...

  7. NEO

    平台: Windows 类型: 虚拟机镜像 软件包: .net core neo application server basic software blockchain neo open sourc ...

  8. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志

    Netweaver 要记录日志需要有一个checkpoint group,可以自行创建也可以使用标准的.这里我重用标准的group:DEMO_CHECKPOINT_GROUP. tcode SAAB, ...

  9. Redis基础数据结构

    Redis数据库中每个键值对都是由对象( c 的结构体对象)组成的. 数据库键总是一个字符串对象(string object) 数据库键的值可以使字符串对象.列表对象(list object).哈希对 ...

  10. IOS 旋转+缩放(手势识别)

    @interface NJViewController ()<UIGestureRecognizerDelegate> @property (weak, nonatomic) IBOutl ...