能给几个C++中STL简单应用的例题和讲解么?
1个回答
展开全部
③ 第三,concept可以想成是一组合法程序。 2. 基本的Concept(所谓正规型别)① assignable 可分配的, 可归属的, 可指定的② default constructible 可默认构造的③ equality comparable 可相等比较的 3.① const iterator 所指的对象不可修改的迭代器② mutable iterator 所指的对象可以被修改的迭代器 4. refinement (精炼、强化)refinement(精炼、强化)。如果conceptC2提供conceptC1的所有功能,再加上其他可能的额外功能,我们使说C2是C1的refinement。 5.五个iterator concepts①input iterator 缩写:InIt②output iterator 缩写:OutIt③forward iterator 缩写:FwdIt④bidirectional iterator 缩写:BidIt⑤random iterator 缩写:RanIt 6.Iterator traits(迭代器特征)与Associate Types(相关型别)①这是为了能在算法中使用Iterator的相关型别而引入的一个中间层主要采用了三种技术A. 使用嵌套型别(这里要用到typename关键字);B. 引入中间层(增加一个类iterator_traits<I>),即所谓的iterator traits 机制;C. 使用偏特化(partial specialization),用来解决 Iterator 不是类(Iterator可能是指针)的情况及Iterator的value types 是常量等情况,这造成了iterator_traits类有以下几个版本: 针对型别为T的引数template<class _Iter> struct iterator_traits;针对型别为T*的引数template<class _Ty> struct iterator_traits<_Ty *>;针对型别为const T*的引数template<class _Ty> struct iterator_traits<const _Ty *>;②Iterator的相关型别(五个)struct iterator_traits{ // get traits from iterator _Iter //标签型别 tag type(迭代器分类型别,共有五个,它们是继承的关系) typedef typename _Iter::iterator_category iterator_category; typedef typename _Iter::value_type value_type; //差距型别 typedef typename _Iter::difference_type difference_type; typedef difference_type distance_type; // retained保留 typedef typename _Iter::pointer pointer; typedef typename _Iter::reference reference;};③自己定义的 Iterator或算法时必须支持iterator_traits.④自己定义的 Iterator类I,最简单的做法就是让I继承iterator; 7.函数对象①function call 操作符被重载 operator()②尽可能地将function object 的operator()声明为const member function③可以拥有member functions和member variables④可以没有默认构造函数 7.函数对象concepts ①无参数(Generator)f(); 单参(Unary)f(x); 双参(Binary)f(x , y);STL所定义的其它function object concepts都是这三种concepts 的refinements.② Generator有一个相关型别result_type;Unary有二个相关型别result_type, argument_type;Binary有三个相关型别result_type, first_argument_type, second_argument_type;③function object具有相关型别,但程序无须知道相关型别的名称④adaptable function object 必须定义所有相关型别,定义时可以继承STL提供的两个基类unary_function和binary_function,简化工作。⑤ adaptable function object是function object的refinements⑥function object作为引数传递给function adapter,则该function object必须是adaptable function object. 8.Predicate n.谓词v.断言 缩写:pr① Predicate 是单一参数(Unary) 并返回 true 或 false 的function object;②相关型别 返回型别(bool) 引数型别 (T) 9. function adapter①adapter是这样一种东西,它能把一种接口转换成另一种接口②adaptable function object作为引数.③几乎所有的STL adapter都提供了辅助函数,这纯粹只是为了方便,因为使用function object 必须给出function object的类型,而辅助函数则无须指明.④如果需要将一般函数指针传递给function object adapter,可以利用 pointer_to_unary_function(该adapter的辅助函数为ptr_fun)等将函数转换为Adaptable Unary Function. 10.Iterator的提领操作:x是Iterator的实例,应该尽可能用(*x).m取代x->m,因为”->”并非广泛地被各家C++编译器所支持。 11.关于集合算法(includes ,set_union ,set_intersection,set_difference等)的一些特点:①要求引数是已排好序的区间(sorted range)②算法的输出区间(output range)一定是已排好序的③set及multiset特别满足泛型的集合算法④技巧:insert_iterator adapter可以使集合算法的输出结果安插至set之中的动作变得格外方便。 12.list,set,map的性质:新元素的安插并不会造成既有元素的iterators失效,从set中删除元素也不会造成任何元素的iterators失效——当然被删除的元素的iterator除外。 13. 如何将vector和string的数据传给遗留的API①vector: 如果你有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了, 唯一的问题就是,如果v是空的,所以在传给API函数之前要先判断v是否为空.同时要给出v的size.②String: 对于string对象s,相应的咒语是简单的s.c_str(),即合s为空也没有问题.③注意: 不要用v.begin()代替&v[0],因为begin的返回类型是iterator,而不是一个指针. 14. :使用“交换技巧”来修整过剩容量例如: vector<Contestant> contestants; …………vector<Contestant>(contestants).swap(contestants); 解释:表达式vector<Contestant>(contestants)建立一个临时vector,它是contestants的一份拷贝:vector的拷贝构造函数做了这个工作。但是,vector的拷贝构造函数只分配拷贝的元素需要的内存,所以这个临时vector没有多余的容量。 15.技巧: 使用一个类(像Lock)来管理资源的生存期线程安全和STL容器 template<typename Container> // 获取和释放容器的互斥量class Lock { // 的类的模板核心;public: // 忽略了很多细节Lock(const Containers container): c(container){getMutexFor(c); // 在构造函数获取互斥量}~Lock(){releaseMutexFor(c); // 在析构函数里释放它}private:const Container& c;}使用Lock类:vector<int> v;...{ // 建立新块;Lock<vector<int> > lock(v); // 获取互斥量vector<int>::iterator first5(find(v.begin(), v.end(), 5));if (first5 != v.end()) {*first5 = 0;}} // 关闭块,自动// 释放互斥量 心得: ①这一技巧适应大多数资源的管理.特别适合涉及线程安全及有异常发生时的资源(资源的申请与释放成对出现)管理.②使用一个类(像Lock)来管理资源的生存期,在构造函数中申请资源,在析构函数中析放资源.(关键)③为要使用的资源建立一个新的程序块,在块的开始处声明一个像Lock那样的管理资源的类变量,而且当我们不再需要该资源时就关闭那个块. (关键)④这样的办法通常称为资源获得即初始化,可以把资源的获得与释放之间的不匹配的机会减到最小.并且在异常的情况下是稳健. 16. :用empty来代替检查size()是否为0 17. 有序区间的搜索算法binary_search、lower_bound、upper_bound和equal_range在一对random access 迭代器区间上查找只花费对数次时间和对数次的比较。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询