容器与数据结构:
容器是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;
}