网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  boost.array源码重列            【字体:
boost.array源码重列
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    
正在装载数据……

#include <cstddef>

#include <stdexcept>

#include <boost/assert.hpp>

 

// Handles broken standard libraries better than <iterator>

#include <boost/detail/iterator.hpp>

#include <boost/throw_exception.hpp>

#include <algorithm>

 

// FIXES for broken compilers

#include <boost/config.hpp>

 

 

namespace kimi_boost {

 

       // 固定大小的数组

    template<class T, std::size_t N>

    class array {

      public:

        T elems[N];    // fixed-size array of elements of type T

 

      public:

        //std:vector完全相同的类型定义

        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;

        typedef std::reverse_iterator<iterator> reverse_iterator;

        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

 

        // iterator support

        iterator begin() { return elems; }

        const_iterator begin() const { return elems; }

        iterator end() { return elems+N; }

        const_iterator end() const { return elems+N; }

 

        // reverse iterator support

        reverse_iterator rbegin() { return reverse_iterator(end()); }

        const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}

        reverse_iterator rend() { return reverse_iterator(begin()); }

        const_reverse_iterator rend() const {return const_reverse_iterator(begin());}

 

        // 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];

        }

 

        // 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]; }

        // 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]; }

        // size is constant

        static size_type size() { return N; }

              static size_type capacity() { 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) {std::swap_ranges(begin(),end(),y.begin());}

 

        // direct access to data (read-only)

        const T* data() const { return elems; }

        T* data() { return elems; }

 

        // use array as C array (direct read/write access to data)

        T* c_array() { return elems; }

 

        //类型安全吗?T2一定能转换为T?

        template <typename T2>

        array<T,N>& operator= (const array<T2,N>& rhs) {

            std::copy(rhs.begin(),rhs.end(), begin());

            return *this;

        }

 

        // assign one value to all elements

        void assign (const T& value){std::fill_n(begin(),N,value);}

 

        // check range (may be private because it is static)

        static void rangecheck (size_type i) {

            if (i >= size()) {

                throw std::range_error("array<>: index out of range");

            }

        }

 

    };

 

 

 

 

    // comparisons

    template<class T, std::size_t N>

    bool operator== (const array<T,N>& x, const array<T,N>& y) {

        return std::equal(x.begin(), x.end(), y.begin());

    }

    template<class T, std::size_t N>

    bool operator< (const array<T,N>& x, const array<T,N>& y) {

        return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());

    }

    template<class T, std::size_t N>

    bool operator!= (const array<T,N>& x, const array<T,N>& y) {

        return !(x==y);

    }

    template<class T, std::size_t N>

    bool operator> (const array<T,N>& x, const array<T,N>& y) {

        return y<x;

    }

    template<class T, std::size_t N>

    bool operator<= (const array<T,N>& x, const array<T,N>& y) {

        return !(y<x);

    }

    template<class T, std::size_t N>

    bool operator>= (const array<T,N>& x, const array<T,N>& y) {

        return !(x<y);

    }

 

    // global swap()

    template<class T, std::size_t N>

    inline void swap (array<T,N>& x, array<T,N>& y) {

        x.swap(y);

    }

 

} /* namespace kimi_boost */

 

 


本文来源:http://blog.csdn.net/laibach0304/archive/2007/08/24/1758078.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • page、request、session、ap…

  • JSF 的性能远不及 JSP 或 St…

  • Struts2学习:在struts2中集…

  • 从头开始认识jboss

  • SPRING+STRUTS+HIBERNATE登录…

  • JSP标准模板库(JSTL)入门教…

  • Cookie又见Cookie-使用Html…

  • 搭建JSTL运行环境

  • struts多附件上传

  • jsf自定义toolbar组件

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David