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的全部内容。