array

容器与数据结构:
 容器是stl中最引人注意的部分,vector,deque,list,set,map分别实现了最常用的动态数组(向量),双端队列,双向链表,集合和映射五种数据结构,它们以泛型的形式提供可以容纳任意的类型。
 boost程序库,实现了数个新型容器(数据结构),如散列容器,循环队列,多维数组等,大大扩展了“容器”概念的内涵和外延
 10个容器(数据结构),首先是array,dynamic_bitset,unordered,bimap和circular_buffer,它们都是对stl原有容器在概念上的扩展,与stl容器的接口相似,随后是tuple,any,variant,它们三个即是数据结构也是特殊的容器,展示了泛型编程的精妙用法,最后介绍新型的容器multi_array和property_tree。这些容器对容纳的元素类型有一个基本要求,析构函数不能抛出异常,有的容器还要求元素具有缺省构造函数或者拷贝构造函数。

array:
#include <boost.array.hpp>
using namespace boost;
array包装了普通数组,并提供类似stl容器的接口;

操作函数:
 array的data()和c_array()以c数组的形式返回内部数组指针,用于需要原始指针的场合,两者的功能基本相同,但data()在需要的时候可以返回一个数组的常量指针,不允许变动容器元素。
 array还提供operator=,swap()和assign()函数
 【1】operator=使用std::copy实现了赋值操作
 【2】swap()使用boost::swap可以高效地交换两个array对象
 【3】assign()使用标准算法std::fill_n将容器内所有元素赋值为value
 此外,array还重载了==,<,>等比较操作符,使用字典比较两个array对象(但没有使用operators库来简化操作符重载定义)

用法:
示范:
#include <iostream>
#include <boost/array.hpp>
#include <boost/typeof/typeof.hpp>
using namespace boost;
using namespace std;
int main(int argc, char* argv[]) //测试主函数
{
 array<int, 10> ar;
 ar[0] = 1;   //使用operator[]
 ar.back() = 10;  //back()访问最后一个元素
 assert(ar[ar.max_size() -1] == 10);
 ar.assign(777);
 for (BOOST_AUTO(pos, ar.begin()); pos != ar.end(); ++pos)
 {
  cout<<*pos<<",";
 }
 int *p = ar.c_array();  //获得原始数组指针
 *(p + 5) = 253;    //指针算术运算
 cout<<ar[5] <<endl;
 ar.at(8) = 666;    //访问元素
 sort(ar.begin(), ar.end()); //使用标准算法排序
 system("pause");
 return 0;
}


能力限制:
 【1】没有构造函数,不能指定大小和初始值(只能用模板参数指定大小) .
 【2】没有push_back()和push_front(),因为不能动态增长.
 【3】不能搭配插入迭代器适配器功能,同样因为它不能动态增长.
 如需要可动态变动容量的数组,使用std::vector或boost::scoped_array.

实现ref_array:
 一个可用的数组代理实现,名字叫ref_array.
 ref_array的设计思想与array很相似,基于内建数组的包装,但array是在编译器指定数组的维数,而ref_array则使用构造函数在运行时指定,因此,ref_array内部除了使用一个指针来存储数组地址外,还有使用一个整型变量来保存数组的大小。ref_array不能动态增长

ref_array的用法:
 ref_array的用法与scoped_array/shared_array类似,都需要有一个原始数组作为它的代理对象,不同的是它只能代理静态数组,如果把它应用于动态数组,那么它不会自动释放内存。
 ref_array的接口几乎与array一样,区别仅在于构造函数,它的模板参数仅接受元素类型,而元素数量则在构造函数中指定。
示范:
#include <iostream>
#include <boost/array.hpp>
#include <boost/typeof/typeof.hpp>
using namespace boost;
using namespace std;

void xor(unsigned char *buf, int buf_len)
{
 ref_array<unsigned char> ra(buf, buf_len);
 for (BOOST_AUTO(pos, ra.begin()); pos != ra.end(); ++pos)
 { *pos ^= 0x5a; }
}

int main(int argc, char* argv[]) //测试主函数
{
 unsigned char szInt[10];
 ref_array<unsigned char> ra(szInt, 10);
 ra.assign(100);
 ra[0] = 25;
 assert(ra.front() == 25);
 xor(rc.c_array(), ra.size());

 system("pause");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值