概要

介绍一下模板类 vector 的常用操作,以及一个应用举例,顺时针打印矩阵。

 


基本定义

模板类 vector 是一种动态数组,它是使用 new 创建动态数组的替代品,实际上,vector 也是使用 new 和 delete 来管理内存,但这种工作是自动完成的。

要使用 vector 对象,必须包含头文件 vector,另外 vector 包含在名称空间 std 中,如下 :

#include<vector>

using namespace std; // 或 using std::vector

// 创建 vector 对象
vector<double> vd; //创建一个空的 double 型矢量
vector<int> vi(5); // 由于 vector 模板使用动态内存分配,因此可以用初始化参数来指出需要多少矢量 vi[0] = 1; // 赋值操作,可以使用通常的数组表示法来访问各个元素
vi[1] = 2;

 

可对矢量执行的操作

所有的 STL 容器都提供了一些基本方法:

  • size():返回容器中元素数目
  • swap():交换两个容器的内容
  • begin():返回一个指向容器中第一个元素的迭代器
  • end():返回一个表示超过容器尾的迭代器(指向最后一个元素后面的那个元素,与 C-风格字符串最后一个字符后面的空字符类似)

迭代器是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针的操作,如解除引用符 * 和递增 ++。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为 iterator 的 typedef,其作用域为整个类。 例如要为 vecor 的 double 类型规范声明一个迭代器,可以这样做:

vector<double>::iterator pd;

假设 scores 是一个 vector 对象,则可以使用迭代器 pd 执行这样的操作:

vector<double> scores;
pd = scores.begin(); // 指向第一个元素
*pd = 22.3;
++pd; // 指向下一个元素

 

常用的操作还有 push_back(),erase(),insert(), pop_back(),empty() ,下面一一举例:

#include<vector>

using namespace std;

int main()
{
vector<int> fib(5) = {0, 1, 1, 2, 3}; // c++11 中可以这样写 cout<< fib.size()<<endl; // 输出 5
vector<int>::iterator pd; //c++11 中可以用 auto pd = fib.begin()
for (pd = fib.begin(); pd < fib.end(); pd++ )
cout<< *pd<<endl; // 输出 0,1,1,2,3 //push_back() 将元素添加到矢量末尾
int temp = 5;
fib.push_back(temp);
cout<<fib.size()<<endl; // 输出 6 //pop_back() 将矢量最后一个元素删除
cout<<fib[fib.size()-1]<<endl; // 输出 5
fib.pop_back();
cout<<fib.size()<<endl;
cout<<fib[fib.size()-1]<<endl;// 输出 3 // erase() 方法删除矢量中给定区间的元素。它接收两个迭代器参数,这些参数定义了要删除的区间。
// 第一个迭代器指向要删除的第一个元素,第二个迭代器指向区间终止处的下一个位置
fib.erase(fib.begin(), fib.begin() + 2); // ,删除 begin() 和 beign()+1 指向和元素
cout<<fib.size()<<endl; // 输出 3 // insert() 方法的功能与 erase() 相反, 它接受 3 个迭代器参数,
// 第一个参数指定了新元素的插入位置,第二个和第三个迭代器参数定义了被插入区间该区间通常是另一个容器的一部分
vector<int> new_fib;
new_fib.push_back(0);
new_fib.push_back(1); fib.insert(fib.begin(), new_fib.begin(), new_fib.end());
cout<<fib.size()<<endl; // 输出 5 cout<<fib.empty()<<endl; // 输出 0,如果空就输出 1,非空就输出 0 return 0;
}

其中模板类 list 基本操作和 vector 类似,但是 list 还有 push_front(),pop_front() 方法。

 


顺时针打印矩阵

题目描述

 

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

\begin{align}

\begin{bmatrix}

1 & 2 & 3 & 4 \\

5 & 6 & 7 & 8 \\ 9& 10 &11 &12 \\ 13 & 14 &15 & 16 \end{bmatrix} \notag

\end{align}

则依次打印出数字 \(1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10\).

 

用 vector 嵌套可以实现每行元素个数不同的“矩阵”。

 

代码如下:

#include<iostream>
#include<vector> //要使用 vector 对象,必须包含头文件 vector using namespace std; // 或 using std:: vector. vector 包含在名称空间 std 中,当然 cin, cout 也在其中 class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) { //注意 > > 中间加个空格
int row=matrix.size(); //矩阵的行数
int col=matrix[0].size(); //矩阵的列数
vector<int> result; //存储数列
if(row==0||col==0)
return result;
int left=0,right=col-1,top=0,btm=row-1;
while(left<=right&&top<=btm)
{
for(int i=left;i<=right;i++) // 打印上边一行,此时定位到右上角元素
result.push_back(matrix[top][i]);
if(top<btm) //判断还有行没
for(int i=top+1;i<=btm;i++) // 打印右边一列,此时定位到右下角元素
result.push_back(matrix[i][right]);
if(top<btm&&left<right) // 判断还有元素没
for(int i=right-1;i>=left;i--) // 打印下边一行,此时定位到左下角元素
result.push_back(matrix[btm][i]);
if(top+1<btm&&left<right)
for(int i=btm-1;i>=top+1;i--) // 打印左边一列,此时定位到左下角元素
result.push_back(matrix[i][left]);
left++;right--;top++;btm--; //打印一圈,缩小范围
}
return result;
}
}; int main()
{
vector<vector<int> > fib = {{1,2,3,4}, {5,6,7,8},{9,10,11,12}, {13,14,15,16}}; Solution myclass;
vector<int> result = myclass.printMatrix(fib); for (auto pd = result.begin(); pd<result.end()-1;pd++)
cout<<*pd<<",";
cout<<result[result.size()-1]<<endl;
return 0;
}

模板类 vector的更多相关文章

  1. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  2. [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template <  class _Ty,  ...

  3. 实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  4. C++之vector模板类

    vector 称为容器模板类,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型.vector 类型的每一种都指定 ...

  5. Vector模板类----构造与析构

    /* 基于C++平台*/ typedef int rank; //用int来定义 “秩” 这种概念 #define DEFAULT_CAPACIITY 3 //默认初始容量,实际应用中可以取更大的值 ...

  6. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...

  7. C++中模板函数或模板类中关键词class和typename

    ##区别 基本上来说,class和typename几乎没有区别.在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class. 可以看出我加黑了两个子:几 ...

  8. 基于ACE的定时器模板类

    ACETimerClockGenerator.h ClockGeneratorIF.h 在类中定义一个结构体,在结构体中定义一个函数. 在结构体中定义一个函数,这样做有什么好呢? TimerHandl ...

  9. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

随机推荐

  1. POJ1088滑雪(记忆化搜索)

    就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...

  2. Unity3D 图形优化

    Unity3D 图形优化 例如DrawCall,我得到的是一些并不完全正确的信息,例如将N个纹理打包成一个图集,这个图集就只会产生一个DrawCall,如果不打成图集,那么就会有N个DrawCall. ...

  3. 如何将含有byte数据项的结构存入MongoDb

    我们知道MongoDb不支持byte(BsonType中根本没有定义byte), 但是在实际生产环境中数据结构(特别是远古时代的数据结构)往往包含byte数据项. 这时候无法保存原有的数据结构,一般会 ...

  4. atcoder#073D(枚舉)

    題目鏈接: http://arc073.contest.atcoder.jp/tasks/arc073_b 題意: 給出n, m兩個數, n是物品數目, m是背包容量, 接下來n行輸入, wi, vi ...

  5. P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)

    传送门 首先所有亵渎的张数\(k=m+1\),我们考虑每一次使用亵渎,都是一堆\(i^k\)之和减去那几个没有出现过的\(j^k\),对于没有出现过的我们可以直接快速幂处理并减去,所以现在的问题就是如 ...

  6. Matlab图像处理相关

    相关函数: 读取:imread() %参数为文件名(路径)或url,格式等 写入:imwrite() %参数为写入数据矩阵,写入文件名(路径),格式等 显示:imshow() %显示由输入决定,属性自 ...

  7. NPOI用WorkbookFactory读写 2007以上格式文件(xlsx)

    //我用的最新的2.2.1版本 //第一步:引用DLL,5个全导入,包括ICSHARP.ZIP,是个开源压缩工具包.XLSX是压缩格式,需要它来解压 //第二部: using NPOI.SS.User ...

  8. bzoj1145[CTSC2008]图腾

    传送门 虽然是远古时期的ctsc,但是果然还是ctsc啊 前置芝士:树状数组 这个题最开始的思路很好想,由于之前写过一个类似处理的题,所以这个题我一开始就想到了思路. 首先,我们可以尝试讲图腾表示为x ...

  9. socketserver 入门练习

    个人理解: 个人感觉socketserver其实就是为服务端专门提供的一个用于解决多用户并发访问需求的一个模块 小试牛刀: 服务端socketserver_server.py import socke ...

  10. 【js】我们需要无限滚动列表吗?

    无限滚动列表,顾名思义,是能够无限滚动的列表(愿意是指那些能够不断缓冲加载新数据的列表的).但是,我们真的需要这样一个列表吗?在PC端,浏览器的性能其实已经能够满足海量dom节点的渲染刷新(笔者经过简 ...