t1_array使用及源码显示

Posted ilove-haha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了t1_array使用及源码显示相关的知识,希望对你有一定的参考价值。

array是stl最简单的模板,其在c++lib中定义如下:

template<typename _Tp, std::size_t _Nm>
struct array
{
typedef _Tp value_type;              //为类定义别名 
typedef value_type& reference;       //引用
typedef const value_type& const_reference;
typedef value_type* iterator;        //指针
typedef const value_type*    const_iterator;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef std::reverse_iterator<iterator>    reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

// Support for zero-sized arrays mandatory.           //支持0大小,目前不太理解它的用法,得出的结论是让array.begin() = array.end()之类的功能。

value_type _M_instance[_Nm ? _Nm : 1]; //定义数组时输入的参数在这里指定数组的大小 // No explicit construct/copy/destroy for aggregate type.聚合类,没有显式的构造/拷贝/析构函数

现在使用array来进行示范。

#include<array>
#include<iostream>
using namespace std;
int main()
{
    array<int,4> arr{11,22,33,44};
    int i=0;

    cout<<"数组arr元素为:"<<endl;

    for(; i<4; i++)
        cout<<"arr["<<i<<"]= "<<arr[i]<<endl;

    return 0;
}

输出如下:

数组arr元素为:
arr[0]= 11
arr[1]= 22
arr[2]= 33
arr[3]= 44

查看重载的[ ]源码如下:

reference      //返回引用operator[](size_type __n)
{
return _M_instance[__n]; } const_reference operator[](size_type __n) const
{ return _M_instance[__n]; }

测试数组大小的函数:

cout<<"arr.empty()= "<<arr.empty()<<endl;
cout<<"arr.size()= "<<arr.size()<<endl;
cout<<"arr.max_size()= "<<arr.max_size()<<endl;

 源码实现为:

技术图片
size_type 
size() const { return _Nm; }

size_type 
max_size() const { return _Nm; }

bool 
empty() const { return size() == 0; }
View Code

 结果如下:

技术图片
arr.empty()= 0
arr.size()= 4
arr.max_size()= 4
View Code

array赋值操作:

array<int,4> array1;

//新数组用666填满    
array1.fill(666);

// 和swap(arr, array1);
arr.swap(array1);

for(i=0; i<4; i++)
    cout<<"arr["<<i<<"]= "<<arr[i]<<endl;

源码实现为:

void
assign(const value_type& __u)
{ std::fill_n(begin(), size(), __u); }   //调用std库的fill_n()

void
swap(array& __other)
{ std::swap_ranges(begin(), end(), __other.begin()); }

遍历数组相关函数:

swap(arr,array1);
auto b = arr.begin();
for(; b != arr.end(); b++)
    cout<<*b<<endl;

源码实现如下:

iterator //iterator是一个int*指针,所以返回的结果要解引用      
begin()
{ return iterator(std::__addressof(_M_instance[0])); }

const_iterator
begin() const 
{ return const_iterator(std::__addressof(_M_instance[0])); }

iterator
end()
{ return iterator(std::__addressof(_M_instance[_Nm])); }

const_iterator
end() const
{ return const_iterator(std::__addressof(_M_instance[_Nm])); }

还有一些常用的元素访问:

cout<<"arr.at(2)= "<<arr.at(2)<<endl;
cout<<"arr.front()= "<<arr.front()<<endl;
cout<<"arr.back()= "<<arr.back()<<endl;
cout<<"*arr.data()= "<<*arr.data()<<endl;

源码如下:

reference
at(size_type __n)
{
 if (__n >= _Nm)
 std::__throw_out_of_range(__N("array::at"));  //只有这个才执行异常检查
 return _M_instance[__n];
}

const_reference
at(size_type __n) const
{
 if (__n >= _Nm)
    std::__throw_out_of_range(__N("array::at"));
    return _M_instance[__n];
}

reference 
front()
{ return *begin(); }

const_reference 
front() const
{ return *begin(); }

reference 
back()
{ return _Nm ? *(end() - 1) : *end(); }

const_reference 
back() const
{ return _Nm ? *(end() - 1) : *end(); }

 _Tp*
 data()
 { return std::__addressof(_M_instance[0]); }

 const _Tp*
 data() const
 { return std::__addressof(_M_instance[0]); }

 输出如下:

arr.at(2)= 33
arr.front()= 11
arr.back()= 44
*arr.data()= 11  //arr.data()返回的是指向第一个元素的指针,所以要解引用

 

以上是关于t1_array使用及源码显示的主要内容,如果未能解决你的问题,请参考以下文章

HTML代码片段

JGUI源码:实现图标按钮及下拉菜单(16)

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段

CSS 显示代码片段:使用PRE标记包裹长行

Flask 编写http接口api及接口自动化测试