杭电ACM基础编程知识点(1)

来源:互联网 发布:淘宝手办黑店 编辑:程序博客网 时间:2024/06/05 13:29

2001
setprecision:控制输出流显示浮点数的有效数字个数,与fixed合用,控制小数点后面有几位。
cout << setprecision(2) << fixed << distance << endl;
iomanip:cin,cout之类的操作算子的头文件

2002
((double)4/3)*PI *r *r *r

2010
水仙花数:153=1^3+5^3+3^3

2011
cout << setiosflags (ios::fixed) << setprecisions(2) << s;

1072
cin >> hex >> x >> y;
cout << dec << x+y << endl;

2629
string a=s.substr(0,4);
获得字符串s中从第0位开始长度为4的字符串。

2014
sort函数 sort(begin,end)
加头文件#include< algorithm >

2025
大写A-Z的ascll码是65-90,小写a-z的ascll码是97-122。
sizeof 和 strlen 的区别:
strlen(char*)函数,求字符串的实际长度,“\0”;
sizeof是操作符,变量声明后所占的内存数。
gets和getline的区别:
cin.getline是C++方法,可限定限制符;
gets是C方法,遇到“\n”结束。
puts(a)函数自带换行功能;
memset(num,0,sizeof(num)); //将num中成员全部初始化为0。

2028
求最小公倍数的两种方法(lowest common multiple plus):
a.辗转相除;b.穷举法

2029
回文串palindromes

2030
汉字机内码的特点:使用两个字节,每个字节最高一位为1,每个字节表示的十进制数都是负数,每个中文占两个字节。

2056
abs()主要用于求整数的绝对值。
fabs()只要是求更高的double,flout绝对值。

2040
亲和数:两个数中任何一个数都是另一个数的真约数之和。

2054
strcmp()函数实际上是对字符的ascll码比较,有减法和直接比较两种方法。

2072
容器参考:
http://www.360doc.com/content/12/0705/08/6828497_222338600.shtml

C函数不使用异常机制来报告错误,也不适合处理新的数据类型。而且标准C函数经常使用内存分配技术,没有经验的程序员很容易写出bug来。C++标准库则提供了更为安全,更为灵活的数据集处理方式。C++标准委员会采纳了STL。

STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过像指针一样的迭代器实现的;容器是像链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。

STL中的常用容器包括:顺序性 容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。

1)顺序性容器
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较 慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。

deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。

list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载,但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
a) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
b) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
c) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2)关联容器
map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。构造map时,是按照一定的顺序进行的。map的插入和删除效率比其他序列的容器高,因为对关联容器来说,不需要做内存的拷贝和移动,只是指针的移动。由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑色),所以map的其中的一个缺点就是比较占用内存空间。

set也是一种关联性容器,它同map一样,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高。 set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须 先删除旧元素,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。set支持集合的交(set_ intersection)、差(set_ difference)、并(set_ union)及对称差(set_ symmetric_difference) 等一些集合上的操作。

3)容器适配器
queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封 装的。之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间,同时在重新申请空间的时候无需拷贝所有元素。

stack是实现先进后出的功能,和queue一样,也是内部封装了deque。自己不直接维护被控序列的模板类,而是它存储的容器对象来为它实现所有的功能。stack的源代码原理和实现方式均跟queue相同。