4.4.2 使用操作符()向容器增加元素
因为operator+=使用上有些小的限制,而且在处理map容器时也显得有些麻烦,assign库使用操作符operator()提供更通用的解决方案。
我们不能直接使用operator(),而应当使用assign库提供三个辅助函数insert()、push_front()、push_back()。这些函数可作用于拥有同名成员函数的容器,接受容器变量作为参数,返回一个代理对象list_inserter,它重载了operator(),=等操作符用来实现向容器填入数据的功能。
示范辅助函数insert()、push_front()、push_back()用法的代码如下:
- #include <boost/assign.hpp>
- int main()
- {
- using namespace boost::assign;
- vector<int> v;
- push_back(v)(1)(2)(3)(4)(5); //使用push_back辅助函数
-
- list<string> l;
- push_front(l)("cpp")("java")("c#")("python"); //使用push_front辅助函数
-
- set<double> s;
- insert(s)(3.14)(0.618)(1.732); //使用insert辅助函数
-
- map<int, string> m;
- insert(m)(1, "one")(2, "two"); //使用insert辅助函数
- }
这段代码与使用operator+=没有太多的不同。对于拥有push_back()或push_front()成员函数的容器(vector、list),可以调用assign::push_back()或assign::push_ front(),而对于set和map,则只能使用assign::insert()。
operator()的好处是可以在括号中使用多个参数,这对于map这样的元素是由多个值组成类型非常方便,避免了make_pair()函数的使用。而且,如果括号中没有参数,那么将调用容器元素的缺省构造函数填入一个缺省值,逗号操作符则不能这样做。
括号操作符也可以与逗号等操作符配合使用,写法更简单,有时甚至看起来不像是合法的C++(www.cppentry.com)代码(但的确是完全正确的C++(www.cppentry.com)代码),例如:
- using namespace boost::assign;
- vector<int> v;
- push_back(v),1,2,3,4,5;
- push_back(v)(6),7,64 / 8,(9),10;
- // v =[ 1 2 3 4 5 6 7 8 9 10]
- deque<string> d;
- push_front(d)() = "cpp","java","c#","python";
- assert(d.size()==5);
- // d = ['python', 'c#', 'java', 'cpp', '']