首先,命名空間為boost,array較小,只有一個(gè)單獨(dú)的array.hpp文件。
array的目的主要是在STL的動(dòng)態(tài)數(shù)組與傳統(tǒng)功能有限的普通數(shù)組之間做一個(gè)折衷。為高效的靜態(tài)數(shù)組增添一些其他的功能。
template<class T,std::size_t N>
class array{
public:
T elems[N];
內(nèi)部的底層實(shí)現(xiàn)即用的傳統(tǒng)的數(shù)組。數(shù)組的大小由初始化時(shí)指定,但類(lèi)型則由模板指定。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;
類(lèi)似于STL的特性萃取機(jī)制。
// iterator support
iterator begin() { return elems; }
const_iterator begin() const { return elems; }
const_iterator cbegin() const { return elems; }
iterator end() { return elems+N; }
const_iterator end() const { return elems+N; }
const_iterator cend() const { return elems+N; }
提供類(lèi)似于STL容器的接口。但這里的實(shí)現(xiàn)很簡(jiǎn)單,因?yàn)槭庆o態(tài)數(shù)組。注意end()返回的指針是指向
數(shù)組之后的一位,這點(diǎn)同STL的接口一致。
reverse_iterator rbegin() { return reverse_iterator(end()); }
const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}
const_reverse_iterator crbegin() const {
return const_reverse_iterator(end());
}
reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator rend() const {
return const_reverse_iterator(begin());
}
const_reverse_iterator crend() const {
return const_reverse_iterator(begin());
}
反向迭代器,也是類(lèi)似于STL中的功能,在具體實(shí)現(xiàn)上就是用的STL的函數(shù)將普通迭代器轉(zhuǎn)化。
// operator[]
reference operator[](size_type i)
{
BOOST_ASSERT( i < N && "out of range" );
return elems[i];
}
const_reference operator[](size_type i) const
{
BOOST_ASSERT( i < N && "out of range" );
return elems[i];
}
重載【】操作符,兩個(gè)版本:const和非const.BOOST_ASSERT是BOOST庫(kù)提供的靜態(tài)斷言功能,可以在編譯期
發(fā)現(xiàn)錯(cuò)誤。比如說(shuō)在程序編譯時(shí)就可以發(fā)現(xiàn)數(shù)組越界,報(bào)錯(cuò)。C的最新標(biāo)準(zhǔn)里也加入了靜態(tài)斷言的內(nèi)容。
// at() with range check
reference at(size_type i) { rangecheck(i); return elems[i]; }
const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
at()訪問(wèn)函數(shù)。亦分const 與非const 版本,二者的不同體現(xiàn)雜返回值上。注意前面的定義,reference
為T(mén)&,const_reference為const T&.實(shí)現(xiàn)上首先也是邊界檢查,我們來(lái)看一下rangecheck函數(shù)
// check range (may be private because it is static)
static void rangecheck (size_type i) {
if (i >= size()) {
std::out_of_range e("array<>: index out of range");
boost::throw_exception(e);
}
}
若游標(biāo)大于界限,則拋出異常,std::out_of_range,
class out_of_range : public logic_error {
public:
explicit out_of_range (const string& what_arg);
};
class logic_error : public exception {
public:
explicit logic_error (const string& what_arg);
};
這里的異常的主要是為了向編譯者提供一個(gè)清晰的錯(cuò)誤說(shuō)明。 // front() and back()
reference front()
{
return elems[0];
}
const_reference front() const
{
return elems[0];
}
reference back()
{
return elems[N-1];
}
const_reference back() const
{
return elems[N-1];
}
front和back函數(shù),實(shí)現(xiàn)起來(lái)是很簡(jiǎn)單的,也很高效的。
// 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 };
類(lèi)似于STL容器的返回大小的接口。因?yàn)槭庆o態(tài)數(shù)組,大小不變,所以主要的目的只是為了與STL的接口兼容,實(shí)現(xiàn)起來(lái)并沒(méi)有多大意義。像empty()函數(shù),對(duì)vector來(lái)說(shuō)很有用,但對(duì)一個(gè)長(zhǎng)度固定的
函數(shù)則是沒(méi)有什么意義的(總是返回false),所以在設(shè)計(jì)上主要的考慮是在別的地方。
// swap (note: linear complexity)
void swap (array<T,N>& y) {
for (size_type i = 0; i < N; ++i)
boost::swap(elems[i],y.elems[i]);
}
boost:swap是utility中的一個(gè)組件。其實(shí)現(xiàn)如下:
namespace boost
{
template<class T1, class T2>
void swap(T1& left, T2& right)
{
::boost_swap_impl::swap_impl(left, right);
}
}
而swap_impl的實(shí)現(xiàn)在boost命名空間之外。
namespace boost_swap_impl
{
template<class T>
void swap_impl(T& left, T& right)
{
using namespace std;//use std::swap if argument dependent lookup fails
swap(left,right);
}
template<class T, std::size_t N>
void swap_impl(T (& left)[N], T (& right)[N])
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::swap_impl(left[i], right[i]);
}
}
}
boost:swap有兩個(gè)template的好處是可以很好地與std:swap分別開(kāi)來(lái)。當(dāng)同時(shí)出現(xiàn)時(shí),std:swap是優(yōu)先的。
// direct access to data (read-only)
const T* data() const { return elems; }
T* data() { return elems; }
直接返回?cái)?shù)組首地址。
T* c_array() { return elems; }
直接返回?cái)?shù)組首地址用于進(jìn)行C類(lèi)型的數(shù)組操作。
template <typename T2>
array<T,N>& operator= (const array<T2,N>& rhs) {
std::copy(rhs.begin(),rhs.end(), begin());
return *this;
}
賦值操作符。用的是STL中的通用算法。
void assign (const T& value) { fill ( value ); } // A synonym for fill
void fill (const T& value)
{
std::fill_n(begin(),size(),value);
}