目录

  • 一、介绍
  • 二、声明及初始化
  • 三、方法
    • 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的向量
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的初值

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

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

三、基本操作

front

vec.font()

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

find

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

返回的是迭代器。

 vector<int>::iterator it = find(vec.begin(), vec.end(), );
if (it != vec.end())
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

 string s("12345asdf");
string a = s.substr(,); //获得字符串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个元素)

 vector<int> a(, ) ;
vector<int> b() ;
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)

二维

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

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


at()成员函数

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

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


容器————vector的更多相关文章

  1. C++线性序列容器<vector>简单总结

    C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...

  2. [C++]STL容器Vector的内存释放

    直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...

  3. STL标准库-容器-vector

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...

  4. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  5. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  6. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  7. 2.2 C语言_实现数据容器vector(排序功能)

    上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...

  8. C++ 顺序容器(vector,list、deque,stack,queue)

    顺序容器的种类有:vector,list.deque 顺序容器适配器: stack     //先进后出   栈 queue   //先进先出   队列 priority_queue   //也优先管 ...

  9. 向量容器vector操作

    1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...

  10. STL之序列容器vector

    首先来看看vector的模板声明: template <class T, class Alloc = allocator<T>> class vector { //… }; v ...

随机推荐

  1. WebService-.Net:添加web引用和添加服务引用有什么区别?

    ylbtech-WebService-.Net:添加web引用和添加服务引用有什么区别? 1.返回顶部 1. 添加web引用和添加服务引用有什么区别,Add Service References 和 ...

  2. 【The type javax.servlet.http.HttpServletRequest cannot be resolved】解决方案

    是缺少serverlet的引用库,解决如下 1.工程右键-properties->java build path 2.在java build path的libraries tab页中选择Add ...

  3. Memecached 服务器安装(一)

    Memecached 服务器安装(一) 前提:首先您的php环境已经安装完成,如若没有则参考 http://www.cnblogs.com/xulele/p/5264781.html 安装环境链接:h ...

  4. 校内模拟赛T5:连续的“包含”子串长度( nekameleoni?) —— 线段树单点修改,区间查询 + 尺取法合并

    nekameleoni 区间查询和修改 给定N,K,M(N个整数序列,范围1~K,M次查询或修改) 如果是修改,则输入三个数,第一个数为1代表修改,第二个数为将N个数中第i个数做修改,第三个数为修改成 ...

  5. 线程休眠只会用 Thread.sleep?来,教你新姿势!

    线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...

  6. python面试题之Python如何实现单例模式?

    #使用__metaclass__(元类)的高级python用法 class Singleton2(type): def __init__(cls, name, bases, dict): super( ...

  7. DevExpress 控件中设置分隔符

    原文:DevExpress 控件中设置分隔符 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net ...

  8. NGUI的widget的使用

    一,我们看看widget有什么属性,如下图: 二,Pivot是什么意思? 我们都知道在Untiy3D中有一个中央坐标点,而这个Pivot这个就是选择控件的某一个点与中央坐标点定位. 如下图区别: 当你 ...

  9. C#设计模式:工厂模式

    一,工厂模式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  10. C#中out和ref的区别

    来源:https://www.cnblogs.com/sunliyuan/p/5999045.html 首先,俩者都是按地址传递的,使用后都将改变原来参数的数值. 其次,ref可以把参数的数值传递进函 ...