http://blog.csdn.net/huang_xw/article/details/8248361
大家都希望可以像操作STL容器一样的去操作数组,C++可没有提供这个东西,有时候你会选择使用vector来替代,不过这毕竟不是个好的办法,毕竟vector模拟动态数组比较稳妥,而用它去替代一个普通的数组,开销毕竟太大了。而恰好,boost::array就为你提供了这个功能。
1. 这样的集合体有如下特点:(1)无用户声明的构造函数。
(2)无私有的或保护的非静态数据成员。
(3)无基类。
(4)无虚拟函数。
boost::array的定义如下(简化):
- template<class T, std::size_t N>
- class array
- {
- public: T elems[N]; // fixed-size array of elements of type T
- public: // type definitions
- typedef T value_type;
- typedef T* iterator;
- typedef const T* const_iterator;
- typedef T& reference;
- typedef const T& const_reference;
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
- // iterator support
- iterator begin() { return elems; }
- const_iterator begin() const { return elems; }
- iterator end() { return elems+N; }
- const_iterator end() const { return elems+N; }
- // operator[]
- reference operator[](size_type i) ;
- const_reference operator[](size_type i) const ; // at() with range check
- reference at(size_type i) ;
- const_reference at(size_type i) const ; // front() and back()
- reference front() ;
- const_reference front() const ;
- reference back() ;
- const_reference back() const ; // size is constant
- static size_type size() { return N; }
- static bool empty() { return false; }
- static size_type max_size() { return N; }
- enum { static_size = N }; // swap (note: linear complexity)
- void swap (array<T,N>& y) ;
- }
这两者都是通过下标访问元素, 但是在越界检查上不一样:
at: 可以用try..catch方法, 获取抛出的异常.
[]: 会抛出assert错误,但总比没有强
具体例子可以看看:
- void test_array()
- {
- // 1. boost::array的构造方法
- const int ELEMS = 6;
- boost::array<int, ELEMS> values1 = {3, 1, 4, 2, 9, 8};
- boost::array<int, ELEMS> values2 = {2, 2, 2};
- boost::array<int, ELEMS> values3(values1);
- boost::array<int, ELEMS> values4 = values2;
- int ar[] = {9, 8, 7, 1, 2, 3, 6, 4, 5};
- // 2. boost::array可以获取数组的长度.
- // 而std::array却没有这个功能, 要用sizeof(array)/sizeof(value_type)来代替
- boost::array<int, ELEMS>::size_type num = values2.size(); // 6
- boost::array<int, ELEMS>::size_type maxnum = values2.max_size(); // 6
- int arsize = sizeof(ar)/sizeof(int); // 9
- // 3. 越界异常
- try
- {
- values1.at(10) = 10;
- }
- catch (std::exception& e)
- {
- std::cout << e.what() << std::endl;
- }
- // 抛出assert错误
- // values1[10];
- // 4. begin, cbegin, end, cend, front, end等容器的函数均可用
- std::copy(values1.cbegin(), values1.cend(), std::ostream_iterator<int>(std::cout, " "));
- std::cout << std::endl;
- int i1 = values1.front();
- int i2 = values1.back();
- assert(i1 == 3);
- assert(i2 == 8);
- // 5. 整体操作数据很方便
- values4.assign(66);
- }
- const int _SIZE = 20000;
- template<typename T>
- void test_array_task(T _int)
- {
- // std::cout << _int << std::endl;
- for (int i = 0; i < _SIZE; ++i)
- {
- for (int j = 0; j < _SIZE; ++j)
- {
- _int[j] = j;
- }
- }
- }
- void test_array_performance()
- {
- // 1. 普通数组
- {
- int _int[_SIZE];
- boost::progress_timer pt;
- test_array_task<int[]>(_int);
- }
- // 2. boost::array
- {
- boost::array<int, _SIZE> a_int;
- boost::progress_timer pt;
- test_array_task<boost::array<int, _SIZE> >(a_int);
- }
- // 3. std::vector
- {
- std::vector<int> b_int;
- b_int.resize(_SIZE);
- boost::progress_timer pt;
- test_array_task<std::vector<int> >(b_int);
- }
- }
- 0.40 s
- 0.39 s
- 0.42 s
- 1.54 s
- 17.75 s
- 33.42 s