

- #include
- #include
- #include
- #include
-
- using namespace std;
-
- int main()
- {
- int ia[6] = {27, 210, 12, 47, 109, 83};
- vector<int, allocator<int>> vi(ia, ia+6);
- // bind2nd(less
(), 40): 元素小于40的值 - cout << count_if(vi.begin(), vi.end(),
- not1(bind2nd(less<int>(), 40))) << endl; // 4
-
- return 0;
- }
在STL中,有些日常开发过程中不常见、令人困惑的C++语法,如template 特化和偏特化、临时对象或者function call操作符等等。

一对迭代器标示的区间是一个前闭后开的区间,也即[fisrst, last),整个实际范围从first开始,知道last-1结束。迭代器last所指的是“最后一个元素的下一位置“。
临时对象,也称无名对象(unnamed objects),通过在template类名称之间直接加上一个小括号,并可指定初值,其意义相当于调用相应的构造函数constructor,且不指定对象名称。
- template <typename T>
- class print
- {
- private:
- T text;
- public:
- print() {};
- print(T elem) : text(elem) {};
-
- void operator() ()
- {
- cout << text << endl;
- }
- };
- int main()
- {
-
- print<int> obj1 ;
- obj1();
- print<int> obj2(10);
- obj2();
-
- // unnamed objects
- print<int>() (); // 前一个()是用来得到临时对象, 后一个()是用来调用operator()操作
- print<int>(20) ();
- return 0;
- }
template特化指的是模板参数在特定类型下的具体实现,即将模型中的参数类型转换为特定(具体)的参数类型。
偏特化(partial specialization)是模板特化的一种特殊形式。一般来说,特征也称他为全特化,即将所有的模板参数替换为具体参数类型,而偏特化是将部分参数类型转换为特定类型。


序列式容器指的是,以线性排列方式(内存地址连续)来存储某一特定类型的数据,包括array、vector、list、forward_list和deque五种。
如下图所示,array容器的大小,在容器创建之后是固定不变的,即不能增加或者删除元素,只能修改元素值。


vector容器是一个长度可变的容器,即在存储空间不足时,会通过allocator自动申请更多的空间。


list容器,以双向链表方式组织元素,支持高效地删除和插入操作,但访问元素,需要遍历整个链表,直到找到目标元素。


forward_list容器,以单链表的形式组织元素,是一类比list容器快、更节省空间的容器。

deque容器可以进行双向扩充,首尾都可以高效插入和删除元素。

map和multi_map的底层实现是RB-tree,其中每个key都对应一个data,且在map中key值是独一无二的,使用multi_map时意味着key值可以重复。



set和multi_set的底层实现同样是RB-tree,且要求key和value值必须相等。


unordered_map和unordered_multimap的底层实现是哈希表,也采用键值对的方式存储数据,且键值对是无序的,擅长通过键查找对应值,但是使用迭代器遍历容器中的元素效率不高。

unordered_set和unordered_multiset容器的底层实现也是哈希表,即键值对是无序的,且key值等于value值。

至此,完成了对C++的STL简单介绍,后续将对六大组件进行详细描述。