分享
 
 
 

Learning boost 2 Array

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Learning boost 2

Array

简介

boost::array是一个对c++数组的包装类。和stl::vector不同的是array和c++数组一样是一个静态大小的容器。请看下面的一个例子:

#include<boost/array.hpp>

#include<iostream>

using namespace std;

int main()

{

boost::array<int,5> a={1,2,3,4,5};

for (int i=0;i<5;++i)

cout<<a[i]<<endl;

return 0;

}

构造

array的原形是:

template<typename T, std::size_t N> class array;

T表示元素的类型,N表示容器的大小。在这里,容器的大小N是模板的一个参数,这意味着不同容器大小的array类型是不同的。

array并没有提供线式的构造函数,只提供了一个对等号运算符的重载。

template<typename U> array& operator=(const array<U, N>&);

构造函数,拷贝构造函数都是用默认的。可以使用如下方法来构造array

boost::array<int,5> a={1,2,3,4,5};

boost::array<int,5> b=a;//使用默认的拷贝构造函数

boost::array<int,5> c;//默认的构造函数,其中每个元素的值是未知的

boost::array<int,5> d={1,2,3};//最后两个元素的值未知

boost::array<int,5> e={1,2,3,4,5,6};//编译错误

boost::array<int,6> f=a;//编译错误,因为array<int,6>和array<int,5>类型不同

boost::array<double,5> g=a;//正确

访问

和vector一样,array既支持迭代器也支持operator[]和at();

operator[]不提供越界保护,而at成员对于越界访问会抛出一个异常。

array支持的迭代器有:

l iterator

l const_iterator

l reverse_iterator

l const_reverse_iterator

相关的成员函数:

l begin()

l end()

l rbegin()

l rend()

l front()

l back()

由于这些东西和stl中使用的方法一样,就不多说了。

另外array提供了data()和c_array()成员函数,data返回const T*,c_array返回T*,都返回c++形式的数组,但是注意data是const的成员函数,c_array不是。

由于array非常简单,下面附上array的源代码:

/* The following code declares class array,

* an STL container (as wrapper) for arrays of constant size.

*

* See

* http://www.josuttis.com/cppcode

* for details and the latest version.

* See

* http://www.boost.org/libs/array for Documentation.

* for documentation.

*

* (C) Copyright Nicolai M. Josuttis 2001.

* Distributed under the Boost Software License, Version 1.0. (See

* accompanying file LICENSE_1_0.txt or copy at

* http://www.boost.org/LICENSE_1_0.txt)

*

* 29 Jan 2004 - c_array() added, BOOST_NO_PRIVATE_IN_AGGREGATE removed (Nico Josuttis)

* 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.

* 05 Aug 2001 - minor update (Nico Josuttis)

* 20 Jan 2001 - STLport fix (Beman Dawes)

* 29 Sep 2000 - Initial Revision (Nico Josuttis)

*

* Jan 29, 2004

*/

#ifndef BOOST_ARRAY_HPP

#define BOOST_ARRAY_HPP

#include <cstddef>

#include <stdexcept>

#include <boost/assert.hpp>

// Handles broken standard libraries better than <iterator>

#include <boost/detail/iterator.hpp>

#include <algorithm>

// FIXES for broken compilers

#include <boost/config.hpp>

namespace boost {

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

// reverse iterator support

#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)

typedef std::reverse_iterator<iterator> reverse_iterator;

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)

// workaround for broken reverse_iterator in VC7

typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,

reference, iterator, reference> > reverse_iterator;

typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,

const_reference, iterator, reference> > const_reverse_iterator;

#else

// workaround for broken reverse_iterator implementations

typedef std::reverse_iterator<iterator,T> reverse_iterator;

typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;

#endif

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

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

T* c_array() { return elems; }

// assignment with type conversion

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(),size(),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 boost */

#endif /*BOOST_ARRAY_HPP*/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有