• STL容器之Array的用法


    各位好,最近我开始学习了STL泛型编程这门课(好吧,我承认学这个课程其实挺晚的),今天我复习了STL容器之array的用法

      一、Array的由来

      二、Array的初始化操作

      三、Array中如何给元素赋值

      四、array和vector的区别

      五、实例程序以及qsort和bserach的使用

      一、Array的由来

        Array是c++11中新引进来的一个容器,我们可以把他当成C语言中数组的一个包装类,基于以上的话,我们可以得到以下特性:

        1、Array再初始化的时候分配的内存大小就是固定的了,后面不可以再修改了。

        2、我们可以利用数组的方法比如int a[10], a[1] = 3这样的方式来存入或者取出数据。

        3、Array本身的内部可以采用类似于数组方式来移动,简单来说&a[5] = &a[0] + 5;(这样的话好处有很多,最大的好处就是比如使用一些strcpy这样的函数是没有限制的)。

      二、Array的初始化操作

        Array的初始化跟数组差不多,简单来说可以分成如下几种:

          1、 std::array<int, 100> c;  (初始化array为100个int元素,然后里面的值不确定)(不过虽然这么说,至少我在我的QtCreator使用的时候front和back都是0)。

          2、 std::array<int, 100> c = {}(初始化array为100个int元素,然后里面的值全部赋值成0)(简单来说就跟数组的memset差不多)

          3、 std::array<int, 100> c = {42} (初始化array为100个int元素,然后里面的值第一部分赋值成42,后面的部分全部赋值为0)

          4、 std::array<int, 100> c(c1) (调用拷贝构造函数,将c1里面的值全部赋值给c)

        我觉得以上四种就足够了。

      三、Array中如何给其他元素赋值

             1、像数组一样c[idx] = 10(给第idx位置赋值成10)

          2、c.at[idx] = 10 (给第idx位置赋值成10)

          3、c.front() (c的首位)

          4、c.back()      (c的末位)

       这里要说一下,第二种是带范围检查的,简单来说就是如果idx超过了最大范围区间,那么会报错的,其他的不会,虽然没测过,但我估计会直接崩溃。

      四、vector和Array的区别

        最大的区别就在于前者的内存是不固定的,后者是固定的,其结果就是前者使用较方便,但是范围不太好确定,后者比较固定,但是无法扩充。

      五、范例程序

      简单说明一下,这个程序的目的就是为了测试array中的size,front,back,data这几个的用法以及测算一下排序的时间,这里我把大小设置成100000(我之前设置成500000最后程序崩了)。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    #include <array>

    #define ARRAY_SIZE 100000

    long getLongTarget();
    std::string getStringTarget();
    void testArray();
    int compareLongs(const void *a, const void *b);

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    // long longTarget = getLongTarget();
    // std::cout<<"longTarget is"<<longTarget<<std::endl;
    // std::string strTarget = getStringTarget();
    // std::cout<<"strTarget is"<<strTarget<<std::endl;
    testArray();
    ui->setupUi(this);
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    // test long
    long getLongTarget()
    {
    long target = 0;
    std::cout<<"target(0~"<<RAND_MAX<<")"<<std::endl;
    std::cin >> target;
    return target;
    }

    // test string
    std::string getStringTarget()
    {
    long target = 0;
    std::cout<<"target(0~"<<RAND_MAX<<")"<<std::endl;
    std::cin >> target;
    char buf[10];
    snprintf(buf, sizeof(buf), "%d", target);
    return std::string(buf);
    }

    void testArray()
    {
    std::array<long, ARRAY_SIZE> a;
    std::array<long, ARRAY_SIZE> aa = {};
    std::array<long, ARRAY_SIZE> b = {42};
    auto startTime = clock();
    std::cout<<"starttime is"<<startTime<<std::endl;
    for (int i=0;i<ARRAY_SIZE;i++) {
    a[i] = rand();
    }
    auto clock1 = clock() - startTime;
    std::cout<<"copy array time is"<<clock1<<std::endl;
    std::cout<<"array size is"<<a.size()<<std::endl;
    std::cout<<"array front is"<<a.front()<<std::endl;
    std::cout<<"array back is"<<a.back()<<std::endl;
    std::cout<<"array data is"<<a.data()<<std::endl;

    long target = getLongTarget();
    // qsort
    qsort(a.data(), sizeof(a.size()), sizeof(long), compareLongs);
    auto pItem = bsearch(&target, a.data(), ARRAY_SIZE, sizeof (long), compareLongs);
    // bsearch
    std::cout<<"qsort time is"<<clock() - clock1 <<std::endl;
    if (pItem != NULL) {
    std::cout<<"find it:"<<*(long *)(pItem)<<std::endl;
    } else {
    std::cout<<"not find it"<<std::endl;
    }
    }

    // compare long
    int compareLongs(const void *a, const void *b)
    {
    return *(long *)a - *(long *)b;
    }

     

     从结果我们可以看出,data的返回值是第一位的地址,front和back为首位和最后一位,sort大概使用了11s左右(bsearch时间基本可以忽略)。

       这就是array的全部内容。

  • 相关阅读:
    旋转数组的最小值
    用堆栈实现队列
    二叉树的重建
    从尾到头打印链表
    实现替换空格
    java获取在各种编码下中文及英文的字符个数
    java定义一个二维数组
    java计算某个坐标是否在范围内
    java调用百度地图API
    map在遍历数据的过程中删除数据不出错
  • 原文地址:https://www.cnblogs.com/songyuchen/p/14226649.html
Copyright © 2020-2023  润新知