兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜

Assign 赋值库

以从所未有如此容易的方法将常数或生成的数据填入容器。
简介

本库的目的是通过重载operator,() 和 operator()()使 得将数据填入容器中可以更容易。这两个操作符让我们可以构造一列数据然后把它们拷贝进容器中:
用逗号分隔的列表:
vector<int> v; 
v += 1,2,3,4,5,6,7,8,9;
用括号分隔的列表:
map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );
除了insert外,push_back,push_front也能用于相应数据结构的对象中(比如deque)。

list_of函数
用于初始化一个容器
list<int> primes = list_of(1)(2)(3)(5)(7)(11);
map_list_of函数
也是初始化容器,为方便map而特别定义的。以前map的添加多用make_pair。
map<int,int> next = map_list_of(1,2)(2,3)(3,4);

truple_list_of函数
同map一样,为truple定制的。
vector<tuple> v = tuple_list_of( 1, "foo", 2 )( 3, "bar", 4 );

函数 repeat(), repeat_fun() 和 range()
多次重复相同的值有时是很烦人的。这时使用 repeat() 会很方便:
vector<int> v;
v += 1,2,3,repeat(10,4),5,6,7,8,9;
// v = [1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]
v = list_of(1).repeat(5,2)(3);
// v = [1,2,2,2,2,2,3]
push_back( v )(1).repeat(1,2)(3);
// v = old v + [1,2,3]
正如我们所见,repeat()的第一个参数是重复第二个参数的次数。

template< class T >
struct next {
T seed;
next( T seed ) : seed(seed) { }

T operator()() {
return seed++;
}
};

vector<int> v;
v += 1,2,repeat_fun(4,&rand),4;
// v = [1,2,?,?,?,?,4] 
push_back( v ).repeat_fun(4,next<int>(0))(4).repeat_fun(4,next<int>(5));
// v = old v + [0,1,2,3,4,5,6,7,8] 

对 repeat_fun() 的第二个参数的唯一要求是,它必须是一个无参函数。
vector<int> v, v2;
v = list_of(1)(2)(3);
v2 = list_of(0).range(v).range(v.begin(),v.end())(4);
// v2 = [0,1,2,3,1,2,3,4]
区域插入也实现了。

ref_list_of和cref_list_of函数
有时需要一个匿名容器,比如用作参数等。ref_list_of也是建立一个容器,只是容器中的值是引用。

头文件
这个库的头文件非常多,原因是它对STL作了扩充,又因为STL各个库的使用也要调用不同的头文件,这里也保持这个约定。
Header头文件 Includes包含
<boost/assign.hpp> 除了对指针容器的支持以外的所有东西
<boost/assign/list_of.hpp> list_of(), map_list_of(), tuple_list_of(), ref_list_of() 和 cref_list_of()
<boost/assign/std.hpp> 各个标准容器的 operator+=() (见后)
<boost/assign/std/deque.hpp> std::deque的operator+=(), <deque>
<boost/assign/std/list.hpp> std::list的operator+=(), <list>
<boost/assign/std/map.hpp> std::map 和 std::multimap 的 operator+=(), <map>
<boost/assign/std/queue.hpp> std::queue 和 std::priority_queue 的 operator+=(), <queue>
<boost/assign/std/set.hpp> std::set 和 std::multiset 的 operator+=(), <set>
<boost/assign/std/slist.hpp> std::slist 的 operator+=(), <slist> (如果有slist)
<boost/assign/std/stack.hpp> std::stack 的 operator+=(), <stack>
<boost/assign/std/vector.hpp> std::vector 的 operator+=(), <vector>
<boost/assign/assignment_exception.hpp> 类 assignment_exception, 可能会由 list_of() 返回的代理所抛出
<boost/assign/list_inserter.hpp> make_list_inserter(), push_back(), push_front(),insert(), push() 和类 list_inserter, 是整个库的骨干
<boost/assign/ptr_list_inserter.hpp> 函数 ptr_push_back(), ptr_push_front() 和 ptr_insert()
<boost/assign/ptr_map_inserter.hpp> 函数 ptr_map_insert()
<boost/assign/ptr_list_of.hpp> 函数 ptr_list_of()

小结
如题,从未有过如此简单的赋值方式。

转自:http://hi.baidu.com/ani_di/blog/item/30eaca1ebc38b069f624e48d.html

posted on 2010-06-05 17:32 会飞的兔子 阅读(769) 评论(1)  编辑 收藏 引用 所属分类: C++库,组件

Feedback

# re: boost库之Assign 赋值库 2010-06-06 15:15 唐风
唉,还是希望出现语言级别的“糖”,还是希望有 initializer-list ……  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理