浅谈Vector容器

来源:互联网 发布:ubuntu 16.04 分区方案 编辑:程序博客网 时间:2024/06/05 16:56

1. vector 容器

定义:vector是C++标准模版库(STL,Standard Template Library)中的部分内容。

称vector为容器的原因:是因为它能够像容器一样存放各种类型的对象。






2. vector 说明

使用vector容器之前必须加上<vector>头文件:#include<vector>

当然,也可以使用include<bits/stdc++.h>一次性所有函数库打包。

Vector需要被限定:

(摘自网页)

属于std命名域的内容,因此需要通过命名限定:using std::vector;

也可以直接使用全局的命名空间方式:using namespace std;






3. vector 动态数组及操作(成员函数)

Vector定义动态(大小可变)数组的方式十分简单

定义方法:vector <类型名>    变量名

例如:

vector <int> a;    (定义大小可变的整型数组:a

vector <char> b;   (定义大小可变的字符型数组:b

vector <data> c;//data为自定义的数据类型,可以为结构体,结构体在算法中很常用。

操作方法主要有以下几种(以可变数组:vector <int> a为例)

1 a[i]——(同静态数组操作方式)返回动态数组中第i个元素;

2 a.empty()——若动态数组为空,则返回true,否则返回false;

3a.size()——返回动态数组中元素的个数;

4a.resize(x)——修改动态数组大小为x

5a.push_back(x)——将x插入动态数组尾部;

6a.pop_back()——删除动态数组尾部的元素;

7a.begin()——返回指向动态数组头部的指针;

8a.end()——返回指向动态数组尾部元素的后一个元素的指针。

(注:以上为vector的成员函数中较为重要的部分,这些函数需重点识记)

 

vector排序模板

要求:1.使用动态数组;2.使用vector成员函数;3.使用STL库的自动排序

#include<iostream>

#include<cstdio>

#include<vector>

#include<algorithm>

/*以上4句可写为: #include<bits/stdc++.h>*/

usingnamespace std;

vector<int> a;//定义动态数组

intmain()

{

    int n;

    cin>>n;

    for(int i=0;i<n;i++)

    {

        int tmp;

        cin>>tmp;

        a.push_back(tmp);//向动态数组末尾添加元素tmp

    }

    sort(a.begin(),a.end());//vector成员函数,找到动态数组的一头一尾,并使用stl排序

    for(int i=0;i<n;i++)cout<<a[i]<<' ';

    return 0;

}

 

(注:我们刚才的操作只是vector成员函数的冰山一角,还有其它一些函数,稍作了解即可。)

9a.erase(pos)——删除pos位置的数据,传回下一个数据的位置;

10a.erase(beg,end)——删除[beg,end)区间的数据,传回下一个数据的位置;

 

11a.insert(pos,elem)在pos位置插入一个elem的拷贝,返回插入的值的迭代器;

12a.insert(pos,n,elem)在pos位置插入n个elem的数据,无返回值;

13a.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据,无返回值;

(

如:

a.insert(a.begin(),10);

a.insert(a.begin(),2,20);

a.insert(a.begin(),a1.begin(),a1.begin()+2);

)

 

14a.front()——

1.返回第一个数据

2.修改头部元素的值;

 

15a.back()——

1.传回最后一个数据,不检查这个数据是否存在

2.修改尾部元素的值;

(如:a.assign(5,10);//往a里放5个10)

 

16a.resize(num)——重新指定队列的长度。(往往用来增加vector的长度,只可从小到大更改)

17a.reserve()——保留适当的容量

//这两点,在学迭代器之前了解即可。

 

18a1.swap(a2)——将a1和a2交换  swap(a1,a2)能达到相同效果

下面,继续:

19 vector<type>a——创建一个空的vector容器;

20 vector<type> a1(a2)——复制一个vector;

21 vector<type> a(n)——创建一个vector,含有n个数据,数据均以缺省(默认)构造产生,即全0;

22 vector<type> a(n,elem)——创建一个vector,含有n个elem的拷贝数据;

23 vector<type> a(beg,end)——创建一个以[beg,end)区间的vector;

24 ~vector<type>()——销毁所有数据,施放内存。

具体代码实现这些成员函数在了解迭代器之后会重点实现。

 






4.Vector迭代器简介及其使用方法

除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)

迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型。

简单介绍:(摘自网页内容)

标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更一般化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector类型也这样。

 

大意:每一种标准容器都有迭代器,但由于大部分标准容器不支持下标操作,所以引入迭代器,来访问,遍历容器元素。

 

迭代器具有以下几点性质:

1.指示某个元素;

2.指示最后一个元素的下一个位置;

3.其它的迭代器都是不合法的。;

4.使用迭代器。

 

一般我们不关心迭代器的准确类型,可以使用auto,当然,不写类型也没有关系。

那么我们今天是初步了解,迭代器的使用暂时不作为理解内容,下面给出两个例子。

for(it = v.rbegin();it!=v.rend();it++)

{

cout << *it << "\t";

}

或者换上准确类型

for(auto it= s.begin(); it != s.end() && !isspace(*it); ++it)

 *it =toupper(*it);

再者,请注意,迭代器的相加是不合法的。

所以,在学习了成员函数和迭代器后,我们可以按照初始化等类型将成员函数进行分类,请读者自行完成。