vector的介绍
vector 向量类,是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
在使用它时, 需要包含头文件 vector, 即#include<vector>
,一般加上using namespace std
。如果不加,则在调用时候必须用std::vector<...>
这样的形式,即在vector前加上std::
,这表示运用的是std
命名空间下的vector容器。
vector 容器与数组相比,优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。vector是一个动态的序列容器,相当于一个size可变的数组。
相比于数组,vector会消耗更多的内存以有效的动态增长。而相比于其他动态序列容器(deques, lists and forward_lists),vector能更快的索引元素(就像数组一样),而且能相对高效的在尾部插入和删除元素。如果不是在尾部插入和删除元素,效率就没有这些容器高。
此外, vector 也提供了许多的方法来对自身进行操作。
向量的声明和初始化
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:
vector<int> a ; //声明一个int型向量a
vector<int> a(10) ; //声明一个初始大小为10的向量
vector<int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
除此之外, 还可以直接使用数组来初始化向量:
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
元素的输入和访问
元素的输入和访问可以像操作普通的数组那样, 用cin>>
进行输入, cout<<a[n]
这样进行输出:
示例:
#include<iostream>
#include<vector>
using namespace std ;
int main()
{
vector<int> a(10, 0) ; //大小为10初值为0的向量a
//对其中部分元素进行输入
cin >>a[2] ;
cin >>a[5] ;
cin >>a[6] ;
//全部输出
int i ;
for(i=0; i<a.size(); i++)
cout<<a[i]<<" " ;//像数组一样以下标访问
return 0 ;
}
在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。在 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所指向的元素值。
向量的基本操作
a.size() //获取向量中的元素个数
a.empty() //判断向量是否为空
a.clear() //清空向量中的元素
- 复制
a = b ; //将b向量复制到a向量中 - 比较
保持==、!=、>、>=、<、<=
的惯有含义 ;
如:a == b ; //a向量与b向量比较, 相等则返回1
- 插入 - insert
(1)a.insert(a.begin(), 1000); //将1000插入到向量a的起始位置前
(2)a.insert(a.begin(), 3, 1000) ; //将1000分别插入到向量元素位置的0-2处(共3个元素)
(3)
vector<int> a(5, 1) ;
vector<int> b(10) ;
b.insert(b.begin(), a.begin(), a.end()) ;//将a.begin(), a.end()之间的全部元素插入到b.begin()前
-
删除 - erase
(1)b.erase(b.begin()) ; //将起始位置的元素删除
(2)b.erase(b.begin(), b.begin()+3) ; //将(b.begin(), b.begin()+3)之间的元素删除
-
交换 - swap
b.swap(a) ; //a向量与b向量进行交换
下面是引用的一些其他操作:
1、初始化
vector // 创建一个空的vector。
vector c1(c2) // 复制一个vector
vector c(n) // 创建一个vector,含有n个数据,数据均已缺省构造产生
vector c(n, elem) // 创建一个含有n个elem拷贝的vector
vector c(beg,end) // 创建一个含有n个elem拷贝的vector
2、析构函数
c.~vector () // 销毁所有数据,释放内存
3、成员函数
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) // 删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end) //删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() // 传回第一个数据。
get_allocator // 使用构造函数返回一个拷贝。
c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置。
c.insert(pos,n,elem) // 在pos位置插入n个elem数据。无返回值。
c.insert(pos,beg,end) // 在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元素互换。同上操作。
operator[] // 返回容器中指定位置的一个引用。
添加元素
vector<int> a;
a.push_back(1); //在尾部加入一个数据
a.push_back(2);
a.pop_back(); //删除最后一个数据
a.insert(a.begin(), 0); //在a.begin()之前加入0
a.erase(a.begin()); //将a.begin()的元素删除
a.erase(a.begin() + 1, a.end()); //将第二个元素以后的元素均删除
排序必须包含algorithm头文件
#include <algorithm>
vector<int> a;
sort(a.begin(), a.end());
二维数组
与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:
vector< vector<int> > b(m, vector<int>(n)); //创建一个m*n的int型二维向量
在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector< vector<int> > b<10, vector<int>(5,0));
//对部分数据进行输入
cin>>b[1][1];
cin>>b[2][2];
cin>>b[3][3];
//全部输出
int m,n;
for(m=0;m<b.size();m++){
for(n=0;n<b[m].size();n++)
cout<<b[m][n]<<" ";
cout<<"\n";
}
return 0;
}
同样, 按照这样的思路我们还可以创建更多维的向量, 不过维数太多会让向量变得难以灵活控制, 三维以上的向量还需酌情使用。
以上内容摘自两篇博文:
https://www.cnblogs.com/YJthua-china/p/6550960.html
https://www.cnblogs.com/aminxu/p/4686332.html