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);
再者,请注意,迭代器的相加是不合法的。
所以,在学习了成员函数和迭代器后,我们可以按照初始化等类型将成员函数进行分类,请读者自行完成。