Vector是向量模板,C++ STL之一(本质上是一个动态数组)。vector是一个动态生长的数组,一开始vector为空时,会给一个初始化的容量 (就是允许的添加个数并申请好内存),当往添加的元素超过现在的容量(capacity)时,就会重新更大申请内存,并把之前的所有元素拷贝到新内存中。数据量不大的情况下,vector非常方便存储和访问操作,当然,数据量大的情况下,查找效率低,删除操作还会导致大量的数组移动操作。

1 基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

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> a; //a为2维数组
vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量
vector <**int> a; //a为3维数组

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

一开始vector为空时,不能对其进行下标赋值,否则会报越界访问错误。容器为空时添加第一个值用push_back().

要按数组索引赋值的话,必须先指定vec大小,否则会报错。如vector<int>numbers(index); //(index个容量,索引0-(index-1))  numbers[0]=1;

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl; //访问t所指向的元素值 for(int i=0; i<a.size(); i++)
cout<<a[i]<<" " ;

(6)插入元素:    vec.push_back(elem) ; 末尾加入一个元素

vec.insert(vec.begin()+i,a);在第i个索引位置插入a(即变成第i+1个元素);

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

vec.insert(vec.begin(), vec_a.begin(), vec_a.end()) ;        //将vec_a.begin(), vec_a.end()之间的全部元素插入到vec.begin()前

(7)删除元素:

vec.erase(pos)  // 删除pos位置的数据,传回下一个数据的位置

vec.erase(vec.begin()+2); 删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

删除vector iterator里面某个值:

vector <int>::iterator it;

for (it = array.begin(); it != array.end();){

if(xxxx)

it=vec.erase(it);

else

it++;

}

(8)向量大小:vec.size();

(9)清空:vec.clear();  但是即使clear()清空元素,vector所占用的内存空间依然如故,无法保证内存的回收。

(10)判断是否为空:  vec.empty()

(11)vec_a向量与vec_b向量进行交换:  vec_b.swap(vec_a) ;

(12) 返回当前vec里面最后一个元素,vec.back()   而不能vec[-1](索引错误),弹出最后一个元素,vec.pop_back();

2.  算法函数

(1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)

(2)使用sort 排序复杂度O(nlogn):需要头文件#include<algorithm>,

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

//定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}

调用 sort(vec.begin(),vec.end(),Comp),这样就实现了降序排序。

对于数组进行排序

Sort(start,end,排序方法),第三个参数不写的时候默认为升序

#include<iostream>
#include<algorithm>
using namespace std; int main(){
int a[]={,,,,,,,,,};
sort(a,a+); //默认升序,如果不是10而是6等更小的数字,也可以部分排序
for(int i=;i<;i++)
cout<<a[i]<<endl;
return ;
}

(3)合并两个vector: 合并nums1和nums2,并将合并后的数组赋值给nums

vector<int> nums1(m),nums2(n);

vector<int> nums;

nums.resize(m+n);

merge(nums1.begin(), nums1.end(),nums2.begin(),nums2.end(),nums);

3.vector里面是结构体

vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std; typedef struct rect
{
int id;
int length;
int width;   //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    }
}Rect; int main()
{
vector<Rect> vec;
Rect rect;
rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
vector<Rect>::iterator it=vec.begin();
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0; }

c++之vector使用的更多相关文章

  1. c++ vector 使用

    1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...

  2. Vector Tile

    Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE ...

  3. ArrayList、Vector、LinkedList的区别联系?

    1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...

  4. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  5. Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  6. C++使用vector

    #include <iostream> #include <string> #include <vector> using namespace std; void ...

  7. [LeetCode] Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  8. C++ 数组array与vector的比较

    转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...

  9. vector定义初始化

    头文件 #include<vector> using std::vector; vector<T> v1; vector<T> v2(v1); vector< ...

  10. vector迭代器用法

    #include<iostream> #include<vector> using namespace std; int main() { vector<int> ...

随机推荐

  1. [DLX精确覆盖] hdu 3663 Power Stations

    题意: 给你n.m.d,代表有n个城市.m条城市之间的关系,每一个城市要在日后d天内都有电. 对于每一个城市,都有一个发电站,每一个发电站能够在[a,b]的每一个连续子区间内发电. x城市发电了.他相 ...

  2. [Javascript Crocks] Recover from a Nothing with the `alt` method

    Once we’re using Maybes throughout our code, it stands to reason that at some point we’ll get a Mayb ...

  3. nginx tomcat glassfish session 复制配置

    1.nginx配置 [root@www1-nlb1 ~]# cat /usr/local/nginx/conf/nginx.conf | grep -v ^$ | grep -v ^# user  w ...

  4. php学习随记3

    <? php #正則表達式 #就是一种描写叙述字符串结构的语法规则 #是一个特定的格式化模式 #1. 行定位符 /* 1) ^行首 2)$行尾 tm eqaul Tomorrow Moon ^t ...

  5. Xamarin Mono For Android、Monotouch 安装

    一.Windows下面的安装 1. 安装环境介绍:    Win8.1 企业版64位或Win7 64.VS2013 update4 2. 安装jdk    到oracle官方下载jdk-8u45-wi ...

  6. luogu2429 制杖题

    题目大意 求不大于 m 的. 质因数集与给定有n个元素的质数集有交集的自然数之和. 数据范围 1 2 3 n*m<=10^7 4 5 n<=2,m<=10^9 6 7 n<=2 ...

  7. luogu2441 角色属性树

    题目大意:维护一个可查询.修改的树,查询的是一个节点的:离它距离最近的.组成两个节点Key值的质因数存在交集的.祖先节点:修改是修改一个节点的key值. 如果组成两个Key值的质因数存在交集,则两个数 ...

  8. Linux - 控制台界面,虚拟界面,字符界面

    tty控制台终端. pts虚拟终端. tty1 图形界面. tty2 字符界面. Ctrl+Alt+F2-6 在字符界面下,通过Alt+F2 切换回来.或者切换到其他的字符界面. Alt+F2 pts ...

  9. Ubuntu搭建docker环境

    一丶自己搭建Ubuntu的虚拟机(网上很多教程) PS:下带图形化界面的Ubuntu镜像,这里只说一下要装那些工具和做那些配置   安装vim         sudo apt-get install ...

  10. JAVA 常用集合接口List、Set、Map总结

    java中频繁使用List.Set.Map接口,将其总结如下 它们的继承与实现关系如下: Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└ ...