模板类 vector

概要

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

原文地址:https://www.cnblogs.com/zhoukui/p/8594378.html

时间: 2024-08-01 15:52:37

模板类 vector的相关文章

数组的代替品——模板类vector, array的使用

在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的. (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begi

Vector模板类

1 #include "stdafx.h" 2 typedef int Rank; //秩 3 #define DEFAULT_CAPACITY 3 //默认的初始容量(实际应用中可设置为更大) 4 5 template <typename T> class Vector 6 { //向量模板类 7 protected: 8 Rank _size; int _capacity; T* _elem; //规模.容量.数据区 9 void copyFrom(T const* A

一个数组类【模板类】

这学期的大作业感觉挺简单的,就是写一个模板类MyList,实现一些Python中的list的操作(类似于c++中的vector,但是不支持迭代器).这些功能都很简单,唯一麻烦的就是模板类特别烦,特别是友元函数,首先要声明这个类,然后声明是函数的声明,然后是类中友元函数的声明,最后是实现.友元函数的声明还有一个问题就是声明时在函数名后面要加上一个<>就像这样: friend void Qsort<>(T a[],int low,int high,bool less); 还有一个要注意

模板类的定义和实现可以不在同一个文件中

写c++程序时我们经常会把函数的定义写在xxx.h中,把函数的实现写在xxx.cpp, 但是当我们写带模版的函数和类时,这样写 就会出现问题,如下: stack.h //stack.h #ifndef STACK_HPP #define STACK_HPP #include <vector> #include <stdexcept> template<typename T, typename TContainer = std::vector<T>> clas

模板类使用示例(一)

以下是一个Stack的模板实现类,注意GCC不支持将模板类的声明和定义分开放(普通类支持): TestCC.h文件的内容: #ifndef TESTCC_H #define TESTCC_H #include <iostream> #include <vector> #include <stdexcept> template <typename T> class Stack { private: std::vector<T> elems; pub

动态顺序表 与 双向链表的模板类

//////////////////////////////////////////////////////////////////////// /////////////////////泛型编程之动态顺序表的模板///////////////////////// //////////////////////////////////////////////////////////////////////// #include<iostream> #include<string> u

基于ACE的定时器模板类

1 ACETimerClockGenerator.h 2 ClockGeneratorIF.h 3 在类中定义一个结构体,在结构体中定义一个函数. 4 在结构体中定义一个函数,这样做有什么好呢? 5 6 TimerHandler.h 7 用了模板的方法去构造定时器类.有助于底层调用上层.在构造的时候就初始化一个类中最大的定时器个数,及模板类(也就是parent). 8 TimerHandler(T *parent, int numTimers) : timers(numTimers, -1) 9

模板类与运算符重载

我自定义了一个模板类并重载了运算符,预定义实现功能为能实现对数组一般操作,类似于vector. #ifndef ARRAY_H #define ARRAY_H #include <iostream> using namespace std; template<class T> class Array{ friend ostream& operator<<(ostream&, const Array &); friend istream&

STL模板类--数据结构与算法

STL提供了一些模板类,实现了<数据结构>中的一些数据结构类型 在写代码时用到栈,队列等数据结构时可以充分利用STL模板类,会发现特别好用. 想起C语言中用数组实现栈和队列,简直就是噩梦. C++是世界上最好的语言...(just kidding !!!) 顺序容器:动态数组vector;deque链表list; 关联容器:set/multiset有序值:map/multimap有序键值对 一. 动态数组vector类 1.定义:#include<vector>  std::vec