C++中vector<vector<int>>的用法-创新互联
注意vector
后面的尖括号前面要加上空格,否则在有些编译器出现问题
一、为什么是vector?vector
>A;//错误的定义方式
vector>A;//正确的定义方式
对于数组,大家常用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是数组的越界可能会引起程序的崩溃,而且动态性不好,包括动态改变大小,动态申请。有什么办法可以解决这些问题吗?
关于vector我不想多说,我假设大家都了解temlplate 和 STL比如map、list、vector等)。 学习C++的时候学到过STL(标准模板库)知道vector提供了operator[]函数。可以像数组一样的操作,而且还有边界检查,动态改变大小。vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。这里只介绍用它来代替二维的数组,二维以上的可以依此类推。vector
array2可以保存3个向量,向量的长度是可以改变的。array2[i]返回的是第i个向量。同理,array2[i][j]返回的是第i个向量中的第j个元素。
vector>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)能够感知内存分配器的
容器使用一个内存分配器对象来动态地处理它的存储需求。
a. 头文件#include
b. 创建vector对象:vector dp;
c. 尾部插入数字:vec.push_back(a);
d. 使用下标访问元素,cout<vector::iterator it;
for(it=vec.begin();it!=vec.end();it++) cout<<*it<
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
(1)vector
//定义了5个整型元素的向量(<>中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.
(2)vector
//定义了5个整型元素的向量,且给出每个元素的初值为1
(3)vector
//用b向量来创建a向量,整体复制性赋值
(4)vector
//定义了a值为b中第0个到第2个(共3个)元素
(5)int b[7]={1,2,3,4,5,9,8};
vector
//从数组中获得初值
vector
nums;//不指定长度
vectornums(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.size()
排序(O(nlogn))
sort(nums.begin(),nums.end());
翻转
reverse(nums.begin(), nums.end());
合并两个vector
合并nums1和nums2,并将合并后的数组赋值给nums
2.3.2 定义二维vectorvector
nums1(m),nums2(n);
vectornums;
nums.resize(m+n);
merge(nums1.begin(), nums1.end(),nums2.begin(),nums2.end(),nums);
vector
>v;
访问二维vector的元素: 如果指定外层和内层向量的大小,就可用operator[]进行读和写;如果只指定外层向量大小,就能用push_back()函数进行写,不能用operator[]进行读和写。
1). 创建m*n的二维vector:
vector
>nums(m ,vector (n)); //m*n的二维vector
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
vector(n)表示构造一个无名且含n个0的vector对象。
2). 动态创建m*n的二维vector
方法一:
vector>nums;
nums.resize(m);
for(int i=0;i
方法二:
vector>nums;
nums.resize(m,vector(n));
3).初始化二维数组
vector` >nums(m ,vector``(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<
三、vector
指针形式比较在使用STL容器(比如map、list、vector等)的时候,是用放一个对象还是放一个对象指针?
即是用vector还是vector
1). vector不需要动态操作内存,不用担心内存泄露等问题;vector
2). 当int改变成其他类型或结构或类的时候,用vector
3). 当需要对变量不断读写操作时,最好得用指针形式,仅仅通过传递指针加快了访问速度。
vectorvectorvecTemp;
for (int i=0; i< 10; i++)
{vecTemp.push_back(i); //这种方式不需要动态new内存,当然也不用delete。
}
vectorvectorvecTemp;
for (int i=0; i< 10; i++)
{ int* nTemp = new int;
*nTemp = i;
vecTemp.push_back(nTemp);
}
vector
;
当使用这种vector指针时,指针a代表的是:不能通过a[i]访问值,只可能通过a->at(i)访问值。
vector& nums
1) int &nums:一个整型变量的引用
2) vector nums:nums是一个容器变量,容器名称为vector,容器内存的数据为int型
3) vector &nums:nums为一个引用,引用的内容是vector这个容器内部存放的整型数据
//1) 创建一维vector
vectornums; //不指定长度
vectornums(n); //指定长度
//2) 添加元素
nums.push_back(1); //直接在末端添加元素1
//3) 删除元素
nums.resize(num.size-i); //删除后面i个元素
nums.pop_back(); //删除最后一个元素
//4) 获取长度
nums.size();
//5) 判空
nums.empty();
4.2vectornums
vector& a;
vectora;
说明: 带&表示传入函数的是vector的引用(即物理位置),函数内部对vector改动,vector就会改变;
不带&表示传入的是vector的复制品(开辟了另一块位置),函数内部对其改动,不会影响原本的vector;
vector< vector>v(m, vector(n) );
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
从结果上看,类似于创建了一个m×n的二维数组,而且可以通过v[i][j]的方式来访问元素(vector支持下标访问元素)。
vector< vector>dp(m, vector(n) )
vector<类型>标识符(大容量,初始所有值)
vector< vector
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站题目:C++中vector<vector<int>>的用法-创新互联
文章出自:http://scyanting.com/article/dghihi.html