【Boost】boost::array详解

http://blog.csdn.net/huang_xw/article/details/8248361

大家都希望可以像操作STL容器一样的去操作数组,C++可没有提供这个东西,有时候你会选择使用vector来替代,不过这毕竟不是个好的办法,毕竟vector模拟动态数组比较稳妥,而用它去替代一个普通的数组,开销毕竟太大了。而恰好,boost::array就为你提供了这个功能

1. 这样的集合体有如下特点:  
(1)无用户声明的构造函数。
(2)无私有的或保护的非静态数据成员。
(3)无基类。
(4)无虚拟函数。
boost::array的定义如下(简化):
  1. template<class T, std::size_t N>      
  2. class array  
  3. {       
  4. public:        T elems[N];    // fixed-size array of elements of type T        
  5. public:        // type definitions        
  6.     typedef T              value_type;  
  7.     typedef T*             iterator;  
  8.     typedef const T*       const_iterator;    
  9.     typedef T&             reference;       
  10.     typedef const T&       const_reference;   
  11.     typedef std::size_t    size_type;        
  12.     typedef std::ptrdiff_t difference_type;      
  13.     // iterator support         
  14.     iterator begin() { return elems; }         
  15.     const_iterator begin() const { return elems; }     
  16.     iterator end() { return elems+N; }         
  17.     const_iterator end() const { return elems+N; }   
  18.     // operator[]         
  19.     reference operator[](size_type i) ;           
  20.     const_reference operator[](size_type i) const ;        // at() with range check         
  21.     reference at(size_type i) ;          
  22.     const_reference at(size_type i) const ;            // front() and back()         
  23.     reference front() ;               
  24.     const_reference front() const ;                
  25.     reference back() ;                 
  26.     const_reference back() const ;               // size is constant          
  27.     static size_type size() { return N; }      
  28.     static bool empty() { return false; }       
  29.     static size_type max_size() { return N; }    
  30.     enum { static_size = N };        // swap (note: linear complexity)         
  31.     void swap (array<T,N>& y) ;      
  32. }  
2. at与[ ]区别
这两者都是通过下标访问元素, 但是在越界检查上不一样:
at: 可以用try..catch方法, 获取抛出的异常.
[]: 会抛出assert错误,但总比没有强
具体例子可以看看:
  1. void test_array()  
  2. {  
  3.     // 1. boost::array的构造方法  
  4.     const int ELEMS = 6;  
  5.     boost::array<int, ELEMS> values1 = {3, 1, 4, 2, 9, 8};  
  6.     boost::array<int, ELEMS> values2 = {2, 2, 2};  
  7.     boost::array<int, ELEMS> values3(values1);  
  8.     boost::array<int, ELEMS> values4 = values2;  
  9.   
  10.     int ar[] = {9, 8, 7, 1, 2, 3, 6, 4, 5};  
  11.   
  12.     // 2. boost::array可以获取数组的长度.  
  13.     // 而std::array却没有这个功能, 要用sizeof(array)/sizeof(value_type)来代替  
  14.     boost::array<int, ELEMS>::size_type num = values2.size();            // 6  
  15.     boost::array<int, ELEMS>::size_type maxnum = values2.max_size();    // 6  
  16.     int arsize = sizeof(ar)/sizeof(int);    // 9  
  17.       
  18.     // 3. 越界异常  
  19.     try  
  20.     {  
  21.         values1.at(10) = 10;  
  22.     }  
  23.     catch (std::exception& e)  
  24.     {  
  25.         std::cout << e.what() << std::endl;  
  26.     }  
  27.     // 抛出assert错误  
  28.     // values1[10];  
  29.   
  30.     // 4. begin, cbegin, end, cend, front, end等容器的函数均可用  
  31.     std::copy(values1.cbegin(), values1.cend(), std::ostream_iterator<int>(std::cout, " "));  
  32.     std::cout << std::endl;  
  33.     int i1 = values1.front();  
  34.     int i2 = values1.back();  
  35.     assert(i1 == 3);  
  36.     assert(i2 == 8);  
  37.       
  38.     // 5. 整体操作数据很方便  
  39.     values4.assign(66);  
  40. }  
3. 普通数组, boost::array, boost::vector性能比较
  1. const int _SIZE = 20000;  
  2.   
  3. template<typename T>  
  4. void test_array_task(T _int)  
  5. {  
  6.     // std::cout << _int << std::endl;  
  7.     for (int i = 0; i < _SIZE; ++i)  
  8.     {  
  9.         for (int j = 0; j < _SIZE; ++j)  
  10.         {  
  11.             _int[j] = j;  
  12.         }  
  13.     }  
  14. }  
  15.   
  16. void test_array_performance()  
  17. {  
  18.     // 1. 普通数组  
  19.     {  
  20.         int _int[_SIZE];  
  21.         boost::progress_timer pt;  
  22.         test_array_task<int[]>(_int);  
  23.     }  
  24.   
  25.     // 2. boost::array  
  26.     {  
  27.         boost::array<int, _SIZE> a_int;  
  28.         boost::progress_timer pt;  
  29.         test_array_task<boost::array<int, _SIZE> >(a_int);  
  30.     }  
  31.   
  32.     // 3. std::vector  
  33.     {  
  34.         std::vector<int> b_int;  
  35.         b_int.resize(_SIZE);  
  36.         boost::progress_timer pt;  
  37.         test_array_task<std::vector<int> >(b_int);  
  38.     }  
  39. }  
release运行结果:
  1. 0.40 s  
  2.   
  3. 0.39 s  
  4.   
  5. 0.42 s  
debug运行结果:
  1. 1.54 s  
  2.   
  3. 17.75 s  
  4.   
  5. 33.42 s  
发现release的结果: boost::array的运行性能甚至比普通数组要好.
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值