STL --> vector向量

时间:2023-03-08 23:50:18
STL --> vector向量

vector向量

  vector是一种对象实体,能够容纳许多其他类型相同的元素,因为又被称为容器。

头文件

  在使用它时,需要包含头文件 <vector>。

#include <vector>

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

using std::vector;
vector<int> vec;

基本操作

函数

表述

c.assign(beg,end)

c.assign(n,elem)

将[beg; end)区间中的数据赋值给c。

将n个elem的拷贝赋值给c。

c.at(idx)

传回索引idx所指的数据,如果idx越界,抛出out_of_range。

c.back()

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

c.begin()

传回迭代器重的可一个数据。

c.capacity()

返回容器中数据个数。

c.clear()

移除容器中所有数据。

c.empty()

判断容器是否为空。

c.end()

指向迭代器中的最后一个数据地址。

c.erase(pos)

c.erase(beg,end)

删除pos位置的数据,传回下一个数据的位置。

删除[beg,end)区间的数据,传回下一个数据的位置。

c.front()

传回第一个数据。

get_allocator

使用构造函数返回一个拷贝。

c.insert(pos,elem)

c.insert(pos,n,elem)

c.insert(pos,beg,end)

在pos位置插入一个elem拷贝,传回新数据位置。

在pos位置插入n个elem数据。无返回值。

在pos位置插入在[beg,end)区间的数据。无返回值。

c.max_size()

返回容器中最大数据的数量。

c.pop_back()

删除最后一个数据。

c.push_back(elem)

在尾部加入一个数据。

c.rbegin()

传回一个逆向队列的第一个数据。

c.rend()

传回一个逆向队列的最后一个数据的下一个位置。

c.resize(num)

重新指定队列的长度。

c.reserve()

保留适当的容量。

c.size()

返回容器中实际数据的个数。

c1.swap(c2)

swap(c1,c2)

将c1和c2元素互换。

同上操作。

vector<Elem> c

vector <Elem> c1(c2)

vector <Elem> c(n)

vector <Elem> c(n, elem)

vector <Elem> c(beg,end)

c.~ vector <Elem>()

创建一个空的vector。

复制一个vector。

创建一个vector,含有n个数据,数据均已缺省构造产生。

创建一个含有n个elem拷贝的vector。

创建一个以[beg;end)区间的vector。

销毁所有数据,释放内存。

声明及初始化

  vector 型变量的声明以及初始化的形式有多种:

vector<int> a ;                                //声明一个int型向量a
vector<int> a() ; //声明一个初始大小为10的向量
vector<int> a(, ) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值

  还可以直接使用数组来初始化向量:

int n[] = {, , , , } ;
vector<int> a(n, n+) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[], &n[]) ; //将n[1] - n[4]范围内的元素作为向量a的初值

输入及访问

  元素的输入和访问可以像操作普通的数组那样, 用 cin>> 进行输入, cout<<a[n] 这样进行输出,示例:

    #include<iostream>
#include<vector> using namespace std ; int main()
{
vector<int> a(, ) ; //大小为10初值为0的向量a //对其中部分元素进行输入
cin >>a[] ;
cin >>a[] ;
cin >>a[] ; //全部输出
int i ;
for(i=; i<a.size(); i++)
cout<<a[i]<<" " ; return ;
}

  在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。

  在 vector<int> b(a.begin(), a.begin()+3) ; 这种声明形式中,(a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。(a.begin(), a.end())则表示起始元素和最后一个元素之外的元素位置。向量元素的位置便成为遍历器, 同时向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
  在上例中讲元素全部输出部分的代码就可以改写为:

   //全部输出
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
cout << *t << " " ;

*t 为指针的间接访问形式, 意思是访问t所指向的元素值。

二维向量
  与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

 vector< vector<int> > b(, vector<int>());        //创建一个10*5的int型二维向量

  在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

例如:

    #include<iostream>
#include<vector> using namespace std ; int main()
{
vector< vector<int> > b(, vector<int>(, )) ; //对部分数据进行输入
cin>>b[][] ;
cin>>b[][] ;
cin>>b[][]; //全部输出
int m, n ;
for(m=; m<b.size(); m++) //b.size()获取行向量的大小
{
for(n=; n<b[m].size(); n++) //获取向量中具体每个向量的大小
cout<<b[m][n]<<" " ;
cout<<"\n" ;
} return ;
}

  同样, 按照这样的思路还可以创建更多维的向量, 不过维数太多会让向量变得难以灵活控制, 三维以上的向量还需酌情使用。