容器————vector

目录

  • 一、介绍
  • 二、声明及初始化
  • 三、方法
    • front
    • find
    • remove
    • erase
    • substr

一、介绍

向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。

在使用它时, 需要, #include<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的初始值

使用数组进行初始化:

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

向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。

1 //全部输出
2 vector<int>::iterator t ;
3 for(t=a.begin(); t!=a.end(); t++)//t就是迭代器,表示元素位置,还可以前后移动
4     cout<<*t<<" " ;//*t为指针的间接访问形式,是访问t指向的元素值

三、基本操作

front

vec.font()

返回当前vector容器中起始元素的引用。

find

不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。

返回的是迭代器。

1 vector<int>::iterator it = find(vec.begin(), vec.end(), 6);
2     if (it != vec.end())
3         cout<<*it<<endl;

从头到尾寻找值为6的元素,返回这个元素的指针。如果没有这个元素,就返回vec.end()。

remove

remove是STL里的通用算法。

std::remove(first,last,val);  

移除[first, last)范围内等于val的元素,只是将待删除元素之后的元素移动到前端,而不是删除。若要真正移除,需要搭配使用erase()。

在vector里面用就类似于

iter = std::remove(vec.begin(), vec.end(), val)

但这个函数只是把val移到vec的末尾,并不真正删除,真正删除还是要调用一次erase函数。

返回新的end()值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化

erase

iterator erase(iterator position);

iterator erase(iterator first, iterator last);

删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。

一般remove和erase两者结合使用

删除vector中值为x的元素:

vec.erase(remove(vec.begin(),vec.end(),x),vec.end());

 substr

1 string s("12345asdf");
2 string a = s.substr(0,5);     //获得字符串s中从第0位开始的长度为5的字符串

形式:

s.substr(pos,n)

返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size()-pos,即不加参数会默认拷贝整个s);

补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾


a.size();   //获取向量中的元素个数

a.empty();   判断向量是否为空,返回true或false

a.clear();  把size(还有的元素个数)设置为0,capacity(分配的内存)不变。

a = b ;            //将b向量复制到a向量中

a == b ;    //a向量与b向量比较, 相等则返回1

a.insert(a.begin(), 1000);            //将1000插入到向量a的起始位置前

a.insert(a.begin(), 3, 1000) ;        //将1000分别插入到向量元素位置的0-2处(共3个元素)

1 vector<int> a(5, 1) ;
2 vector<int> b(10) ;
3 b.insert(b.begin(), a.begin(), a.end()) ;        //将a.begin(), a.end()之间的全部元素插入到b.begin()前

b.erase(b.begin()) ;                     //将起始位置的元素删除

b.erase(b.begin(), b.begin()+3) ;        //将(b.begin(), b.begin()+3)之间的元素删除

b.swap(a) ;            //a向量与b向量进行交换

vec.push_back(x);  //将x添加到末尾,vector长度自动增1

vec.pop_back();  //去掉数组最后一个数据

at()                得到编号位置的数据

begin()           得到数组头的指针

end()             得到数组的最后一个单元+1的指针

vec.front()        得到数组头的引用

back()            得到数组的最后一个单元的引用

max_size()     得到vector最大可以是多大

capacity()       当前vector分配的大小

resize()  改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

reserve()      改变当前vecotr所分配空间的大小

erase()         删除指针指向的数据项

vec.rbegin()        将vector反转后的开始指针返回(其实就是原来的end-1)

vec.rend()        将vector反转构的结束指针返回(其实就是原来的begin-1)

二维

1 vector< vector<int> (中间一定要有空格)> b(10,vector<int>(5)); // 创建一个10x5的int二维向量,一定要有空格!!  > > 正确;>>错误!
2 vector<vector<int> > b;正确
vector<vector<int>> b;错误! 3 b[1][1] = 5;//把5赋给[1][1]位置

c++11中列表初始化可以应用于vector 和 array数组。


at()成员函数

vector<int> a[5] = {1,3,4,5,6};
a.at(3) = 66;//等同于a[3] = 66

使用at()时,将在运行期间捕获非法索引,而程序默认将中断。


原文地址:https://www.cnblogs.com/pacino12134/p/10962846.html