`
zhangyafei_kimi
  • 浏览: 264117 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

boost.array源码整理和使用说明

阅读更多

Source

#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 */

Test code

template<typename T>

struct generator

{

T operator()()

{return static_cast<T>(::rand());}

};

template<typename T>

struct displayer

{

void operator()(const T& t)

{

std::cout<<t<<std::endl;

}

};

void array_test()

{

using kimi_boost::array;

array<int,10> ai;

array<float,10> af;

std::generate(ai.begin(),ai.end(),generator<int>());

std::for_each(ai.begin(),ai.end(),displayer<int>());

std::cout<<std::endl;

std::generate(ai.rbegin(),ai.rend(),generator<int>());

std::for_each(ai.rbegin(),ai.rend(),displayer<int>());

ai.assign(10);

af.assign(<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3.14" unitname="F">3.14f</chmetcnv>);

std::for_each(ai.begin(),ai.end(),displayer<int>());

std::for_each(af.begin(),af.end(),displayer<float>());

array<int,10> ai2;

std::generate(ai2.begin(),ai2.end(),generator<int>());

ai.swap(ai2);

std::for_each(ai.begin(),ai.end(),displayer<int>());

std::for_each(ai2.begin(),ai2.end(),displayer<int>());

}

Output

41

18467

6334

26500

19169

15724

11478

29358

26962

24464

5705

28145

23281

16827

9961

491

2995

11942

4827

5436

10

10

10

10

10

10

10

10

10

10

3.14

3.14

3.14

3.14

3.14

3.14

3.14

3.14

3.14

3.14

32391

14604

3902

153

292

12382

17421

18716

19718

19895

10

10

10

10

10

10

10

10

10

10

分享到:
评论

相关推荐

    boost源码.rar

    标题中的“boost源码.rar”指的是Boost库的1.65.1版本的源代码压缩包,这个版本在2017年发布,是一个稳定且广泛使用的版本。在Linux环境下,这些源代码可以被编译成二进制库,供开发者在他们的C++项目中引用和使用。...

    Boost.org融合模块.zip

    Boost.org 是一个知名的开源库集合,它为C++编程提供了大量的工具和库,旨在提高效率、可移植性和代码质量。这个“Boost.org融合模块.zip”文件很可能包含了Boost库中的一个或多个模块,特别是与“fusion”相关的...

    boost源码库

    4. **容器**:Boost库中的`multi_array`和`array`提供了一种更灵活的数组实现,而`fusion`库则为元编程提供了高级容器支持。 5. **迭代器**:Boost.Iterator库提供了一些增强的迭代器,如`filter_iterator`、`...

    arm架构下的boost库文件

    3. **算法和容器**:Boost提供了一些高级算法(如并行算法)和容器(如multi_array),这些工具能够帮助开发人员编写更高效和可维护的代码。 4. **正则表达式**:Boost.Regex库实现了标准C++11之前的正则表达式功能...

    boost库1.65.1源码

    5. **容器和迭代器**:Boost提供了一些扩展的容器,如`multi_array`(多维数组)、`bimap`(双向映射)和`property_tree`(属性树),以及一些增强的迭代器,如`transform_iterator`和`zip_iterator`。 6. **泛型...

    boost入门-了解boost库函数的文档

    5. Boost源码剖析:这是针对Boost库源码的深入分析,可以帮助程序员更好地理解库的内部结构和实现机制,从而更高效地使用库提供的功能。 6. Boost.Array文档:是一个固定大小的数组容器,提供了标准数组所不具备的...

    Boost库学习指南.pdf

    - **具体组件文档**:例如Boost.Assign、Boost.Regex和Boost.Array等组件的文档,详细介绍了各个组件的功能和使用方法。 - **源码分析**:对Boost库的部分源码进行了深度解析,帮助高级用户理解其内部实现机制。 ##...

    mysql-boost-5.7.24.tar.gz

    1. **解压源码包**:使用`tar -zxvf mysql-boost-5.7.24.tar.gz`命令解压文件。 2. **配置**:进入解压后的目录,运行`./configure --prefix=/usr/local/mysql --with-boost=/path/to/boost`,指定安装路径和Boost库...

    c++资源Boost库及指南

    - **开源免费**:Boost库完全开源,用户可以自由地使用、修改和分发。 - **可移植性强**:可以在多种操作系统和编译器环境下使用。 - **标准化进程的推动者**:许多Boost库的功能最终被采纳进入C++标准库。 - **社区...

    boost_1_72_0_src.7z

    为了使用这个源码,你需要先解压`boost_1_72_0_src.tar.bz2`文件,通常可以使用`tar`命令进行解压。解压后,你可以按照Boost的构建指南进行配置和编译,以便在你的项目中使用这些库。对于C++开发者来说,理解和学习...

    C++ boost开发教程

    根据给定文件的信息来看,似乎存在一定的混淆,文件内容与标题“C++ boost开发教程”以及描述“boost库使用”不相符。但从题目要求出发,本应回答将尝试基于提供的标题和描述来构建相关知识点。 ### C++ Boost库...

    boost_1_53_0_beta1.tar.gz

    用户需要按照Boost提供的安装指南来编译和安装这个库,以便在自己的项目中使用。 Boost库包含的组件丰富多样,如: 1. **智能指针**(Smart Pointers):如shared_ptr、unique_ptr和weak_ptr,它们提供了比标准C++...

    flex array应用实例源码

    在这个“flex array应用实例源码”中,我们很可能会看到如何使用这种数据结构来创建和操作动态数组。 首先,让我们理解`flex array`的基本概念。与传统的C++数组不同,`flex array`不是在声明时就需要指定固定大小...

    boost_1_81_0.tar.gz

    要使用Boost库,首先需要解压"boost_1_81_0.tar.gz",然后根据Boost的安装指南编译和安装。这通常涉及配置、编译和安装步骤,可能需要使用到`bjam`或`b2`构建工具。安装完成后,就可以在项目中通过`#include`指令...

    超越c++标准库——boost程序库导论.zip_/资料_C/C++__源码/资料_C/C++_

    2. **容器与算法**:Boost库扩展了C++标准库中的容器和算法,如`multi_array`多维数组、`unordered_map`无序关联容器和`foreach`循环迭代器,提供了更丰富的数据结构和高效的操作方法。 3. **泛型编程**:Boost库...

    Boost库学习指南

    - **阅读源码**:通过阅读Boost库的源码来更好地理解其实现原理。 - **参与社区**:加入Boost社区,与其他开发者交流心得。 ##### 高级阶段 - **贡献代码**:对Boost库进行贡献,提出改进意见或修复bug。 - **撰写...

    boost1.3中文帮助(chm)与安装说明

    这个压缩包包含了Boost 1.3版本的中文帮助文档以及Windows平台的安装和配置说明,对于C++开发者来说,特别是初学者,是非常有价值的资源。 首先,让我们详细了解一下Boost中文帮助文档(chm文件)。CHM是Microsoft...

    boost1.79源代码

    在分析或使用Boost1.79源代码时,开发者可以通过阅读源码、查看头文件中的注释、参考Boost官方文档,甚至参与社区讨论来了解每个库的细节。这对于深入学习C++编程、提升编程技巧、优化代码性能以及解决实际问题都是...

Global site tag (gtag.js) - Google Analytics