C++泛型和算法
看书的速度终于慢了下来,倒不是难于理解,而是需要理解的东西有点多。
先吐槽下C++Primer这本书,不少地方都是用抽象的语言进行介绍!
拜托,你这是介绍,不是总结!
像容器适配器那里:
“本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种 不同的抽象类型的工作方式实现。”
直接说转换接口不是更通俗易懂吗???
>>>>>>>>>>>>>>>>>吐槽结束>>>>>>>>>>>>>>>>>>>>>
泛型,generic,这个概念比较抽象。当初学Java的时候对这个词就不知所云,不过看过例子就明白了。--纠结于汉语的博大精深~
C++中的泛型也是类似的概念,虽然还没看到后面的部分。
算法,书中特指的是标准库自带的算法,据说100多种,大多用于操作容器(将IO流也看作某种序列)。
基本上,算法应用于一段范围内的元素上,而算法又独立于容器,所以算法大多是通过一对迭代器来遍历并操作元素。
所以要求迭代器能自增自减、能解引用、能比较、能标识结尾,有的还要求容器的元素类型支持比较等---这与具体的算法有关,就不一一细说了。
注意,多数时候不要求类型匹配,只要元素可以比较即可。
迭代器:容器对象迭代器、io流对象迭代器!--因为io流可以看做一种序列,其迭代器可以自增。
容器对象迭代器的格式如下:
C<T>::iterator iter=c.begin(); // or .end()
C<T>::const_iterator iter=c.begin(); // or .end()
C<T>::reverse_iterator iter=c.rbegin(); // or .rend()
io流对象迭代器的格式如下:
istream_iterator<T> in(istream&); //绑定输入流,如cin等。
istream_iterator<T> eof; //超出末端迭代器!!!用于判断是否结束。
ostream_iterator<T> out(ostream&); //绑定输出流,如cout等。
上面,需要说明的是,如果输入流遇到错误或结束符,则迭代器指向eof。
另外,io对象流中的数据需要迭代器不断自增以读取或输出。
关于容器逆向迭代器,就是从尾部rbegin()开始,至头部前面rend()。可以通过vi.base()获取对应的正向迭代器--但是注意了,二者并非指向同一个元素!!!
书中罗列的函数
find(b, e, val); //范围内查找元素,如找到,返回该元素的迭代器,否则返回超出末端迭代器。 find_if(b, e, func); //范围内查找满足函数func的元素,返回第一个满足元素的迭代器或超出末端迭代器。 accumulate(b, e, init_val); //累加范围内的元素,再加上init_val。init_val的意义在于指明类型。务必注意字符串字面值和string的区别,这里不会自动转换! find_first_of(b1, e1, b2, e2); //从第一个范围内查找第二范围内出现的任意的元素。可用于统计公有元素数量或元素(见例子) fill(b, e, val); //范围内的元素用val覆盖。 fill_n(iter, count, val); //从iter开始,用val覆盖count长度范围内的元素。--要求iter+count在有效范围内!!! //迭代器适配器 back_inserter(c); //写入的时候,底层调用push_back front_inserter(c); //写入的时候,底层调用push_front。所以vector不行。 inserter(c); //写入的时候,底层调用insert。 //迭代器适配器返回包装后的迭代器,方法一样,但操作不同。如: fill_n(back_inserter(c), count, val); //这样会在尾部追加count个val。 copy(b, e, iter); //将范围内的元素复制到iter后面。 //算法的_copy版本!对输入元素进行处理,但不修改原元素,而是创建一个副本。 replace(b, e, v1, v2); //用v2替换范围内的v1。 replace_copy(b, e, iter, v1, v2); //用v1替换范围内的v2,并保存到iter处。be范围内不变。--需要指定目标迭代器 sort(b, e); //对范围内的元素进行排序 stable_sort(b, e, func); //其实就是懒排序,例如通过长度排序时,只要相邻的元素长度一致,则相对位置不会改变。 unique(b, e); //将范围内的元素去重后 覆盖范围内前面的元素,返回没被覆盖的第一个元素迭代器。 count(b, e, val); // count_if(b, e, func); //
C++泛型和算法的更多相关文章
- c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法
通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...
- c/c++ 通用的(泛型)算法 generic algorithm 总览
通用的(泛型)算法 generic algorithm 总览 特性: 1,标准库的顺序容器定义了很少的操作,比如添加,删除等. 2,问题:其实还有很多操作,比如排序,查找特定的元素,替换或删除一个特定 ...
- C++泛型程序设计---算法和提升
算法和提升 算法:所谓算法就是一个求解问题的过程或公式,即,通过一个有穷的计算序列生成结果. 函数模板就是普通函数的泛化:它能对多种数据类型执行动作,并且能用以参数方式传递来的各种操作实现要执行的工作 ...
- C++泛型线性查找算法——find
C++泛型线性查找算法--find <泛型编程和STL>笔记及思考. 线性查找可能是最为简单的一类查找算法了.他所作用的数据结构为一维线性的空间.这篇文章主要介绍使用 C++ 实现泛型算法 ...
- 泛型(Generics)
Framework类库中的泛型 泛型可以使代码重用,提高开发效率 CLR允许在引用类型.值类型或接口中定义泛型方法: CLR允许创建泛型引用类型.泛型值类型(枚举不允许创建).泛型委托类型和泛型接口类 ...
- STL笔记(6)标准库:标准库中的排序算法
STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...
- 十一、C# 泛型
为了促进代码重用,尤其是算法的重用,C#支持一个名为泛型的特性. 泛型与模块类相似. 泛型使算法和模式只需要实现一交.而不必为每个类型都实现一次.在实例化的时候,传入相应的数据类型便可. 注:可空值类 ...
- Java Collections API和泛型
Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...
- <NET CLR via c# 第4版>笔记 第12章 泛型
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...
随机推荐
- jquery 事件注冊 与反复事件处理
<!doctype html> <html lang="us"> <head> <meta charset="utf-8&quo ...
- 软件测试自动化之- 基于反射的UI自动化测试框架 - UI Automation Test Framework
测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操 ...
- java web中jsp常用标签
在jsp页面开发过程中,经常需要使用JSTL(Java Server Pages Standard Tag Library)标签开开发页面,是看起来更加的规整舒服. JSTL主要提供了5大类标签库: ...
- HDU 2444 The Accomodation of Students二分图判定和匈牙利算法
本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配. 究竟怎样学习一种新算法呢? 我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己 ...
- Qt多个信号连接到一个槽,在槽中识别信号的发送者方法(实验 可行)
Qt是通过信号和槽的机制进行事件传递的,当有多个不同类型.或相同类型的物件的发送信号都通过一个槽来处理的时候,需要在槽中识别出这些信号然后做相应的处理. 例如: 在一个界面中有16个按钮(QPushB ...
- 初识CSS样式表
背景介绍: 接触了新闻公布系统,这也是自己第一个B/S的项目.从之前的拖拽空间.任意布局到现在的HTML总会有非常多的新奇.棘手和挑战.可是不管是何种形式都离不开主要的步骤:做前台.做后端.能够说一个 ...
- vim:去掉响铃
vim在移动字符出界(上下左右)包括按<ESC>建都会响铃,有时候真的很烦. 在网上搜了一下,原来是visualbell来控制的,在vim里使用命令:help visualbell,原来禁 ...
- js冒泡法和数组转换成字符串示例代码
将数组转换成字符串的方法有很多,讲解下js冒泡法的使用.js代码: //js冒泡法与数据转换为字符串的例子 //整理:www.jbxue.com window.onload = function(){ ...
- android即时消息处理机制
在android端做即时消息的时候.遇到的坑点是怎么保证消息即时性,又不耗电.为什么这么说呢? 原因是假设要保证消息即时性.通常有两种机制pull或者push. pull定时轮询机制,比較浪 ...
- Ubuntu C/C++开发环境的安装和配置
安装ubantu会自动安装GCC,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件包,安装了这个包会自动安装上g++,libc6-dev,l ...