zoukankan      html  css  js  c++  java
  • C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要

    本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解。即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结


    引言

    因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表、二叉树、图等,在使用这些数据结构时感到有些吃力。主要是对一些主要的数据结构理解的不够。所以趁着暑假假期。近期一段时间总会抽出时间复习一下数据结构。參考的教材是王立柱编著的《C/C++与数据结构》,在详细的应用中採用的是C++标准模板库STL中相应实现的数据结构,主要參考的是MSDN文档


    正文

    基本数据结构

    数据结构中最简单的一个实现就是线性表中的顺序表,其数据结构如图所看到的:


    数据结构上的实现为:

    typedef struct

    {

      DataType *m_pData;

        int m_nMax,m_nSize;

    }SeqList;

    typedef int DataType;

    从结构上看。顺序表就是一个动态数组,须要有一个容量为m_nMax和一个用来记录表中已经有多少数据的m_nSize。而动态数组的容量在执行过程中是能够扩充和缩减的。因此也就比单纯的数组具有更加灵活的结构!

    顺序表在C++的标准模板库中的实现

    相应在C++的STL标准模板库中的实现是模板 vector:

    <span style="font-size:18px;">template <
       class Type, 
       class Allocator = allocator<Type> 
    >
    class vector</span>

    当中。Type是vector中存储的数据类型。使用时要包含头文件<vector>和命名空间std。

    vector模板类中使用的数据类型

    首先先认识一下vector模板类中最常使用的数据类型:

    iterator 迭代器

    用来提供对vector中元素随机訪问的一个数据类型,可读可改动。

    const_iterator 常量迭代器

    用来提供对vector中元素随机訪问。仅仅能读一个const不变的元素。

    详细使用例如以下:

    <span style="font-size:18px;">// vector_begin.cpp
    // compile with: /EHsc
    #include <vector>
    #include <iostream>
    
    int main()
    {
        using namespace std;
        vector<int> c1;
        vector<int>::iterator c1_Iter;
        vector<int>::const_iterator c1_cIter;
    
        c1.push_back(1);
        c1.push_back(2);
    
        cout << "The vector c1 contains elements:";
        c1_Iter = c1.begin();
        for (; c1_Iter != c1.end(); c1_Iter++)
        {
            cout << " " << *c1_Iter;
        }
        cout << endl;
    
        cout << "The vector c1 now contains elements:";
        c1_Iter = c1.begin();
        *c1_Iter = 20;
        for (; c1_Iter != c1.end(); c1_Iter++)
        {
            cout << " " << *c1_Iter;
        }
        cout << endl;
    
        // The following line would be an error because iterator is const
        // *c1_cIter = 200;
    }</span>

    vector模板类的成员函数

    assign 

    擦除改vector,并复制详细的元素到这个矢量中。

    <span style="font-size:18px;">// vector_assign.cpp
    // compile with: /EHsc
    #include <vector>
    #include <iostream>
    
    int main( )
    {
       using namespace std;
       vector<int> v1, v2, v3;
       vector<int>::iterator iter;
    
       v1.push_back(10);
       v1.push_back(20);
       v1.push_back(30);
       v1.push_back(40);
       v1.push_back(50);
    
       cout << "v1 = " ;
       for (iter = v1.begin(); iter != v1.end(); iter++)
          cout << *iter << " ";
       cout << endl;
    
       v2.assign(v1.begin(), v1.end());
       cout << "v2 = ";
       for (iter = v2.begin(); iter != v2.end(); iter++)
          cout << *iter << " ";
       cout << endl;
    
       v3.assign(7, 4) ;
       cout << "v3 = ";
       for (iter = v3.begin(); iter != v3.end(); iter++)
          cout << *iter << " ";
       cout << endl;
    }</span>
    输出为:

    v1 = 10 20 30 40 50 
    v2 = 10 20 30 40 50 
    v3 = 4 4 4 4 4 4 4

    front和back 

    分别返回vector中第一个和最后一个元素的引用。使用案比例如以下:

    <span style="font-size:18px;">// vector_back.cpp
    // compile with: /EHsc
    #include <vector>
    #include <iostream>
    
    int main() {
       using namespace std;   
       vector <int> v1;
       
       v1.push_back( 10 );
       v1.push_back( 11 );
    
       int& i = v1.back( );
       const int& ii = v1.front( );
    
       cout << "The last integer of v1 is " << i << endl;
       i--;
       cout << "The next-to-last integer of v1 is "<< ii << endl;
    }</span>
    输出为:

    The last integer of v1 is 11
    The next-to-last integer of v1 is 10

    其它操作函数 

    swap在两个vector之间交换元素;size获取表中数据的个数;resize又一次调整vector的数据个数;reserve保留一个最小长度的存储空间;push_back(size加1)和pop_back(size-1)实现的是在vector尾部插入和删除数据;insert在特定的位点插入一个或很多元素。erase擦掉一个或者一段范围内的元素。

    clear是擦除整个vector中的元素(size=0)。


    重载运算符 

    []使得vector能够像数组一样訪问。=使得vector能够直接用右边的矢量去替换,而不用对左边进行存储空间的初始化等操作。


    其它注意事项和使用经验 

    有了以上的说明,我们在使用时,还须要知道一下的几种初始化,vector嵌套的定义和使用小技巧等:

    vector<vector<float>> test = vector<vector<float>>(5,vector<float>(6, 0.0f));

    这样就初始化了一个二维的float 型 vector。如今test里面装有5个float型的vector<float>,而这个float型的vector<float>又被初始化为6个0.0f的一维vector。

    在C++中常用引用&作为函数的形參。比方vectorMutiply(vector<float>& x1, vector<float>& x2)。

    定义完vector,没有进行初始化操作,直接採用push_back()的方法能够进行插入,vector的最大存储空间capacity会动态的添加。用户不须要进行手动的调整。另外,能够直接利用等号=进行copy赋值操作。它的空间会系统自己主动分配。





  • 相关阅读:
    linux上部署javaWeb项目
    Android 调试native的crash和anr
    你怎么知道你的网站K
    Win 10开门人类智慧的世界领先
    Preference如何增加在activity生命周期监听器
    智能指针模板,要管理动态分配的内存
    两分钟找到一些注意事项
    javascript---在自由落体实现
    URAL 1934 Black Spot --- 最短的简单修改
    最简单的ADABOOST人脸检测程序。COPY执行,前提是你配置OpenCV周围环境
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6789007.html
Copyright © 2011-2022 走看看