概要
介绍一下模板类 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
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;
}