C++中vector<vector<int> >的基本使用方法

目录
  • 前言
  • 一、为什么是vector?
  • 二、什么是vector?
    • 2.0 容器特性
    • 2.1. 基本操作
    • 2.2. 常见定义方法:
    • 2.3. 使用方法
      • 2.3.1 创建一维vector:
      • 2.3.2 定义二维vector
  • 三、vector<int>指针形式比较
  • 四.几种常见场景
    • 4.1 vector<int>& nums
    • 4.2 vector<int> nums
    • 4.3 vector< vector<int> > v(m, vector<int>(n) );
    • 4.4 vector< vector <int> > dp(m, vector<int>(n) )
  • 总结

前言

注意vector<vector<int> >后面的尖括号前面要加上空格,否则在有些编译器出现问题

vector<vector<int>> A;//错误的定义方式
vector<vector<int> > A;//正确的定义方式

一、为什么是vector?

对于数组,大家常用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是数组的越界可能会引起程序的崩溃,而且动态性不好,包括动态改变大小,动态申请。有什么办法可以解决这些问题吗?

关于vector我不想多说,我假设大家都了解temlplate 和 STL比如map、list、vector等)。 学习C++的时候学到过STL(标准模板库)知道vector提供了operator[]函数。可以像数组一样的操作,而且还有边界检查,动态改变大小。vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。这里只介绍用它来代替二维的数组,二维以上的可以依此类推。

vector<vector<int> > array2(3);

array2可以保存3个向量,向量的长度是可以改变的。array2[i]返回的是第i个向量。同理,array2[i][j]返回的是第i个向量中的第j个元素。

   vector<vector<int>  > array2(3);
   array2[1][2]=9;

我保证你的程序会segement failed,原因就是你没有指定向量的大小。用push_back函数可以解决问题,如下:

for(int i=0;i<3;i++)
   array2[i].resize(3);//就定义了一个3X3的数组了(另一个3在 申明时定义的)。而且你可以随时改变它的大小

二、什么是vector?

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

2.0 容器特性

1)顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2)动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。

3)能够感知内存分配器的

容器使用一个内存分配器对象来动态地处理它的存储需求。

2.1. 基本操作

a. 头文件#include<vector>

b. 创建vector对象:vector dp;

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

d. 使用下标访问元素,cout<<dp[0]<<endl;记住下标是从0开始的。

使用迭代器访问元素.

vector::iterator it;
for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;

e. 插入元素: vec.insert(vec.begin()+i,a);在第i个元素后面插入a;

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

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

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

g. 清空:vec.clear();//清空之后,vec.size()为0

2.2. 常见定义方法:

(1) vector<int> a(5); //定义了5个整型元素的向量(<>中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.

(2)vector<int> a(5,1);//定义了5个整型元素的向量,且给出每个元素的初值为1

(3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值

(4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素

(5)int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //从数组中获得初值

2.3. 使用方法

2.3.1 创建一维vector:

vector<int>nums;//不指定长度
vector<int>nums(n); // 指定长度为n

添加元素

nums.push_back(1);//直接从数组末端添加
nums[i] = 1;//直接赋值给第i个位置

删除元素

nums.resize(nums.size-i); //直接将数组长度减小,某种方式上删掉了后面i个
nums.pop_back();//删掉最后一个元素

数组遍历

for(int i = 0; i < nums.size(); i++) cout<<nums[i]<<endl;

获得长度

nums.size()

排序(O(nlogn))

sort(nums.begin(),nums.end());

翻转

reverse(nums.begin(), nums.end());

合并两个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);

2.3.2 定义二维vector

vector<vector<int> > v;

访问二维vector的元素: 如果指定外层和内层向量的大小,就可用operator[]进行读和写;如果只指定外层向量大小,就能用push_back()函数进行写,不能用operator[]进行读和写。

1). 创建m*n的二维vector:

vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二维vector

定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

vector(n)表示构造一个无名且含n个0的vector对象。

2). 动态创建m*n的二维vector

方法一:

vector<vector <int> > nums;
nums.resize(m);
for(int i=0;i<m;i++) nums[i].resize(n);

方法二:

vector<vector <int> > nums;
nums.resize(m,vector<int>(n));

3).初始化二维数组

vector<vector `<int>` > nums(m ,vector`<int>`(n,0)); //m*n的二维vector,所有元素为0

获得二维数组的行数:nums.size();

获得二维数组的列数:nums[0].size()

4). 数组遍历

int m = nums.size(),n = nums[0].size();
for(int i = 0; i < m; i++){
    for(int j = 0; j < n; j++){
        cout<<nums[i][j]<<endl;
    }
}

三、vector<int>指针形式比较

在使用STL容器(比如map、list、vector等)的时候,是用放一个对象还是放一个对象指针?

即是用vector还是vector<int*>,这里的vector可以换成其他的容器,int可以换成其他基本类型,也可以自定义的数据结构或类。

1). vector不需要动态操作内存,不用担心内存泄露等问题;vector<int*>要注意new和delete成对使用。

2). 当int改变成其他类型或结构或类的时候,用vector<int*>这种方式比较方便,容器里放的内容占用的内存也相对要少一些,指针在用的时候,去申请空间,不用,那就是个占用4个字节的地址。

3). 当需要对变量不断读写操作时,最好得用指针形式,仅仅通过传递指针加快了访问速度。

vector<int>
vector<int> vecTemp;
for (int i=0; i< 10; i++)
{
    vecTemp.push_back(i);    //这种方式不需要动态new内存,当然也不用delete。
}
vector<int*>
vector<int*> vecTemp;
  for (int i=0; i< 10; i++)
  {
      int* nTemp = new int;
      *nTemp = i;
      vecTemp.push_back(nTemp);
  }

vector<int> *a;

当使用这种vector指针时,指针a代表的是:不能通过a[i]访问值,只可能通过a->at(i)访问值。

四.几种常见场景

4.1 vector<int>& nums

1) int &nums:一个整型变量的引用

2) vector nums:nums是一个容器变量,容器名称为vector,容器内存的数据为int型

3) vector &nums:nums为一个引用,引用的内容是vector这个容器内部存放的整型数据

//1) 创建一维vector
vector<int> nums; //不指定长度
vector<int> nums(n); //指定长度
//2) 添加元素
nums.push_back(1); //直接在末端添加元素1
//3) 删除元素
nums.resize(num.size-i); //删除后面i个元素
nums.pop_back(); //删除最后一个元素
//4) 获取长度
nums.size();
//5) 判空
nums.empty();

4.2 vector<int> nums

vector<int>& a;
vector<int> a;

说明: 带&表示传入函数的是vector的引用(即物理位置),函数内部对vector改动,vector就会改变;
不带&表示传入的是vector的复制品(开辟了另一块位置),函数内部对其改动,不会影响原本的vector;

4.3 vector< vector<int> > v(m, vector<int>(n) );

定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

从结果上看,类似于创建了一个m×n的二维数组,而且可以通过v[i][j]的方式来访问元素(vector支持下标访问元素)。

4.4 vector< vector <int> > dp(m, vector<int>(n) )

vector<类型>标识符(最大容量,初始所有值)

vector< vector<int> > v(m, vector<int>(n) );定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

总结

到此这篇关于C++中vector<vector<int> >基本使用的文章就介绍到这了,更多相关C++ vector<vector<int> >用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中vector容器的常用操作方法实例总结

    1 获得容器最后一个元素  ------ 使用 back或rbegin 取得 // back.rbegin 有常量和引用两种形式 std::vector<int> myVector; myVector.back()=3; std::vector<int>::reverse_iterator tailIter; tailIter=myVector.rbegin(); *tailIter=3 2 删除某元素 需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍

  • C++ 中Vector常用基本操作

    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,下面通过本文给大家介绍,具体内容如下所示: (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的. (5)使用迭代器访问元素. vect

  • C++中vector的用法实例解析

    本文实例展示了C++中的vector用法,分享给大家供大家参考.具体如下: 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小. 例如: // c语言风格 int myHouse[100] ; // 采用vector vector<int> vecMyHouse(100); 当如上定义后,vecMyHouse

  • C++ vector的用法小结

    c++ vector用法 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板. 标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化 vector< typeName > v1

  • C++中vector<vector<int> >的基本使用方法

    目录 前言 一.为什么是vector? 二.什么是vector? 2.0 容器特性 2.1. 基本操作 2.2. 常见定义方法: 2.3. 使用方法 2.3.1 创建一维vector: 2.3.2 定义二维vector 三.vector<int>指针形式比较 四.几种常见场景 4.1 vector<int>& nums 4.2 vector<int> nums 4.3 vector< vector<int> > v(m, vector&l

  • 详解Java中的Vector

    Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vector存放的元素,初始化默认长度为10 protected Object[] elementData; //元素个数 protected int elementCount; //每次扩容大小,默认为0 protected int capacityIncrement; //构造函数,无指定初始化大小和

  • Java编程中的vector类用法学习笔记

    java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的"动态数组"一般都由指针来实现.为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一.事实上,灵活使用数组也可以完成向量类的功能,但向量类中提供大量的方法大大方便了用户的使用. 创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先

  • 详解C++编程中的vector类容器用法

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请

  • 深入理解C++中的vector类的用法及特性

    //<vector> template < class T, class Alloc = allocator<T> > class vector; 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为

  • 详解C++中的vector容器及用迭代器访问vector的方法

    vector vector是相同类型对象的集合.集合中的每个对象有个对应的索引.vector常被称为容器(container). 为了使用vector,需要: #include <vector> using std::vector; vector是一个类模版(class template).C++有函数模版和类模版.模版本身不是函数或类,必须通过指定 类型让编译器去实例化(instantiation)它.比如vector<int> ivec. vector是模版,不是类型.从vec

  • 详解Java编程中向量(Vector)的应用

    Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一种类似于"动态数组"的功能,向量与数组的重要区别之一就是向量的容量是可变的. 可以在向量的任意位置插入不同类型的对象,无需考虑对象的类型,也无需考虑向量的容量. 向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量: 如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对

  • C++中的vector容器对象学习笔记

    C++中数组很坑,有没有类似Python中list的数据类型呢?类似的就是vector! vector 是同一种类型的对象的集合 ,每个对象都有一个对应的整数索引值.和 string 对象一样,标准库将负责管理与存储元素相关的内存. 我们把 vector 称为容器,是因为它可以包含其他对象 . 一个容器中的所有对象都必须是同一种类型的 . vector对象的定义和初始化 同样的,使用前,导入头文件#include <vector> 可以使用using声明:using std::vector;

  • C++中检查vector是否包含给定元素的几种方式详解

    概述 在编码中经常会遇到一种场景,就是要在数组或列表中查找某个元素是否存在,其实对于这种线性操作,自己实现一个循环来检查是非常简单的事情,那既然这样,为啥还要专门写篇博客来分享呢? 一个最重要的原因就是我们原本就可以用更简洁直观高效的方式去替代手写for循环,这个方式就是使用C++标准库函数. 再啰嗦几句. 通常在面试的时候,为了考察面试者的编码功底,会让其从头实现某些基础的算法,但是在实际开发中,很多东西都有现成的封装.只有把语言.标准库"双剑合璧"才能算是真正的C++.而且据C++

  • Java 中的vector和list的区别和使用实例详解

    要了解vector,list,deque.我们先来了解一下STL. STL是Standard Template Library的简称,中文名是标准模板库.从根本上说,STL是一些容器和算法的集合.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分.指针被封装成迭代器,这里vector,list就是所谓的容器. 我们常常在实现链表,栈,队列或者数组时,

随机推荐