Generic Programming and the STL笔记1

来源:互联网 发布:低调桌面时钟软件 编辑:程序博客网 时间:2024/05/22 06:29
1 泛型编程和面向对象编程不同,它并不要求你通过额外的间接层来调用函数;它让你撰写完全一般化并可重复运用的算法,其效率和“针对特定数据类型而设计”的算法旗鼓相当。


2 STL编译效率不高。因为需要template引数推导(argument deduction)和具现化(instantiation),但不影响运行效率。


3 对象持久性(object persistence):保存对象的状态,从而可以在以后恢复且使用。STL尚未支持对象持久性(persistence)。


4 adapters配接器(适配器)。allocators配置器。template classes(可参数化的型别)。


5 STL把算法和数据结构完全分离开来,互不耦合。


6 泛型算法:用来描述算法步骤的实际指令;正确指定“其引数型别必须满足之性质”的一组需求条件。


7 定义抽象的concepts,并根据抽象的concepts来撰写算法与数据结构,是泛型编程的本质。


8 泛型(genericity),具有“在多种数据型别上皆可操作”的含意。


9 泛型编程:concepts, modeling和refinement
STL: iterators, containers, function objects

10 concept:一组“描述某个型别”的条件
model:当某个型别满足所有这样的条件
条件: 一组有效表达式


11 正规型别(regular type):一种同时满足Assignable, Default Constructible, Equality Comparable


12 任何时刻,某个区间内只能有一个有效的input iterator, output iterator。而forward iterator没有这限制。
同一性:p和q都是可提领指针,那么当且仅当*p与*q是同一对象, p==q才成立。


13 refinement(精炼、强化):如果concept C2提供concept C1的所有功能,再加上其他可能的额外功能,则C2是C1的refinement。


14 value type:iterator会指向某物,而此物的型别为这iterator的value type


15 type inference:型别推论


16 typename I::value_type  在模块里,指明typename后面是类型


17 value type(数值型别)
总是在class以嵌套型别定义value_type
template <class Node>
struct node_wrap
{
typedef Node value_type;
};


template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
偏特化
template <class T>
struct iterator_trait<T*>
{
typedef T value_type;
};
template <class T>
struct iterator_trait<const T*>
{
typedef T value_type;
};
associated type:
typename iterator_traits<T>::value_type   没有const
typename iterator_traits<T>::difference_type 
typename iterator_traits<T>::reference_type 有const
typename iterator_traits<T>::pointer  有const
*p的型别不是value type, 而是reference type
iterator tags(是个类)
typename iterator_traits<T>::iterator_category


18 Predicate:单一参数并返回true或false的function objects
Binary Predicte:两个参数并返回true或false的function objects


19 function object相关型别(associated types):指其引数与其返回值的型别
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
template<class Arg1, class Arg2, class Result>
struct binary_funciton {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};


20 function object和adaptable function objects的区别

adaptable function objects会指明参数与返回型别,内含嵌套的typedef


21 adaptable function objects
template <class AdaptablePredicate>
class unary_negate
unary_negate<IsEvenClass> iseven(IsEvenObject);
IsEvenClass需要包含typedef ... argument_type或继承unary_function


template <class Arg, class Result>
class pointer_to_unary_function : public unary_function<Arg, Result>
主要用于确定函数类型,当有多个重载函数。把函数指针转换为函数对象。


22 类型
value_type
pointer
const_pointer
reference
const_reference
difference_type
size_type
iterator
const_iterator


23 template非型别参数:编译期常量


24 iterator不一定能修改指向的值,如set的iterator和const_iterator都是指向const value type


25 output iterator不一定支持range


26 Sequence Container
S.insert(p, x)在p之前插入
back insert sequence和front insert sequence
front insert sequence的成员函数front, push_front和pop_front
back insert sequence的成员函数back, push_back和pop_back


27 安插语义和覆盖语义
int A[5] = {1, 2, 3, 4, 5};
vector<int> V;
copy(A, A+5, V.begin());//覆盖
copy(A, A+5, back_inserter(V));//安插


28 Sequence Container和Associative Container
Sequence Container不要求特定顺序
Associative Container会根据特定规则来排列,方便查找
都包含成员函数insert和erase,但Sequence Container必须需要一个参数指定插入的位置,而Associative Container不需要。


29 Associative Container
比Sequence Container多个associcated type(key type)
两种Simple Associative Container和Pair Associative Container
Simple Associative Container的value type和key_type一样
Pair Associative Container的value type为pair<const key, T>,非pair<key, T>,因为只允许增加和删除,不允许更改


30 Total ordering和Strict Weekly ordering
Total ordering是一种Strict Weekly ordering。Total ordering每个等价类只含单一数值。
class含有两个字段,first _name和last_name。如果operator<只针对last_name,则为Strict Weekly ordering。
Partial ordering满足:irreflexivity(自反性), antisymetry(非对称性)和transitivity(传递性)

自反性:f(x,x)为false

非对称性:f(x, y)为TRUE,则 !f(y,x)为TRUE

传递性:f(x,y)且f(y,z),则f(x,z)

Strict Weekly ordering在Partial ordering基础上满足Transitivity of equivalence(等价性的传递)

而Total ordering在Strict Weekly ordering基础上,必须满等价和相等一致。


31 Trivial Iterator
只用于指向其他某个object,不能遍历object形成的range
为Assignable和Equality Comparable的强化


32 C指针三种价值
dereferenceable(可取值的)
past the end(可跨越尾端)
singular(可为NULL)(非法指针)


33 Input Iterator和Output Iterator不保证能够访问同一个Input Iterator i两次
Input Iterator强化于Trivial Iterator
Output Iterator强化于Assignable,即不必支持operator ==
Output Iterator提领,不会返回有用的值,没有value type概念,*x=t没有理由让operator=只接受单一型别。
Output Iterator可以是singular iterator。singular iterator只需要支持将一个nonsingular iterator赋值给singular iterator
任何时候对某个特定的Output Iterator而言,都应该只有一份有效复制品。即使用Output Iterator x的复制品y后,原来的iterator x就不应该再使用了。
对于Output iterator(intervening increment)
*x=t; ++x; *x=t2; ++x;有效
*x=t; ++x; ++x; *x=t2;无效

34 Forward Iterator
强化于input iterator, output iterator, default constructible


35 unordered_set和unordered_map的iterator为forward iterator
而set和map的iterator为bidirectional iterator


36 Random Access Iterator
强化于Bidirectional Iterator和Strict Weekly Comparable


37 negate与unary_negate的区别
negate<T>取相反数
unary_negate<类型> 变量(对象)
算法使用变量
struct IsOdd_class {
bool operator()(const int& x) const {return x%2==1;}
typedef int argument_type;
}IsOdd_object;
unary_negate<IsOdd_class> IsEven_object(isOdd_object);
count_if(v.begin(), v.end(), IsEven_object);

38 Strict Week Ordering和Strict Weekly Comparable
Strict Week Ordering使用operator<比较
Strict Weekly Comparable使用function object比较
因此less_equal<T>和greater_equal<T>非Strict Weak Ordering的model。


39 container的size()复杂度至少为O(N),而vector和deque为O(1)
max_size()和empty()复杂度为O(1)


40 Forward Container相等性==
a.size()==b.size且a每个元素和b每个元素一样。


41 Forward Container有序性
不同的两个迭代动作会以相同的次序访问元素(前提两个迭代动作之间没有执行任何会造成container内容改变的操作)

42 forword_list没有back(),效率为O(n)
而list vector deque都有back(),效率为O(1)


43 Associative Container
mp.find(k) 返回 iterator或const_iterator
mp.equal_range(k) 返回pair<const_iterator, const_iterator>
对于Unique Associative Container
mp.insert(t) 返回pair<X::iterator, bool>  插入成功为TRUE,否则为FALSE
对于Multiple Associative Container
mp.insert(t) 返回X::iterator


44 Pair Associative Container
key_type
mapped_type(data type)
value_type
mp.begin()->first 返回值的引用
mp.end()->second  返回值的引用,可修改mapped_type


45 Sorted Associative Container
mp.key_comp()   函数对象
mp.value_comp()  函数对象 最终转换为key比较
mp.lower_bound(k) 闭,不小于k  k<=value
mp.upper_bound(k) 开, 大于k  k<value

mp.equal_range(k) 返回值等价于 [mp.lower_bound(k), mp.upper_bound(k))


46 Hashed Associative Container
hash.hash_funciton()  函数对象
hash.keq_eq()  函数对象
hash.resize(n)  不会造成iterator失效,但会改变iterator间的次序关系


47 function tmplate arguments之explicit specification(显示指定)


0 0
原创粉丝点击