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; }
结果如下:
arr.empty()= 0 arr.size()= 4 arr.max_size()= 4
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使用及源码显示的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段