ACM之启程
最近一周忽然发现了一个事情,就是我好像对于我们的程序设计,忽然有了那么一种亲切的感觉。当然了,举个最通俗,最简单的例子来说,大都知道“=”,就是“等于”嘛,在我们程序设计里,就是“赋值”,就最近发现,这个符号好像原来就是“赋值”的样子。我感觉程序设计在我的土地上,发芽了。
新的课程,acm程序设计,修读的第一周。
春风化雨的一周,收获颇多,可是总感觉对于新学的知识,特别是学习了但没用过的那部分总感觉是虚浮着的,可能没用过,总会感觉心里没底吧。也因为是新手,会出现一些因经验欠缺而出现的错误,和一些技巧上的问题。换句话说,就是把程序写的很低级(low的一批),还有许多错误(我也很烦,为什么手上不长个眼睛呀,没办法,手瞎,所以说,要不断的练习,当一些东西成为下意识的东西,错误肯定也就少了)。怎么说呢,还是要多做些题吧,多见见,多用用,把一些东西内化于心,对于一些技巧、经验的东西,看到之后就可以习惯性的拿来用,这样的我们,从学习别人的,把知识变成自己的,内化于心后,慢慢升华,那么下一步,就是我们的创新了。
还有一个事,我想说一下,就是写程序的时候会出现错误,或多或少,特别是对于一些新手的朋友们来说,这是很正常的。其实说这个事情不只是为了跟大家说,也是跟我自己说,可能大家每个人的情况都不一样,对于我自己来说,改程序其实是一个挺费神的过程的,因为有时候对于一些比较难的程序,我们可能不只是错了一些部分上的问题,可能对于整体的思想来说就是错误的,当你的程序改了很多次,可是还是达不到效果的话,还是要给一些经验比较丰富的老师或者是比较厉害的同学们看一下,提高自己的效率,收获更多更有效的知识。对我自己来说的话,我有一个不好的习惯,对于一个题来说的话,我可能会用非常长的一段时间,按照我自己先入为主的思想来做,很可能是错误的,那我有时候就是不信邪,非要那么做,还做不出来。当然了,如果时间充裕的话,还是可以钻研的,但是如果时间真的有限,还是少做一些无用功的好。
我们看一下新学的知识:
字符串(string)、栈(Stack)、队列(queue)、动态数组(vector)、sort函数、优先队列(priority_queue)、去重(unique)、生成排列、upper_bound 和 lower_boun、set和multiset、map和multimap。
string:
C++的字符串类型
string 表示可变长度的字符序列
使用string 类要包含头文件
字符串是对象
string 类支持字符串对象的各种操作
关于读写string对象:
使用标准库中iostream可以读写string对象
可以用循环读取未知数量的string对象
输入操作符返回输入流对象,如果输入流对象处于有效状态,表示没有遇到文件结束或非法输入
getline()函数
两个参数:输入流对象和存放读入字符串的string对象
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的string对象中,流中的换行符被读取并丢弃
返回参数输入流对象
判断stirng对象是否为空:
empty()函数判断string对象是否为空,返回一个布尔值,即为stringObj.empty()
比较string对象:
可以用关系运算符比较两个字符串对象
两个string相等意味着它们的长度相同,并且所包含的字符也完全相同
字符串的大小关系依照字典顺序定义且区分大小写字母
string对象的赋值和连接:
允许把一个string对象的值赋给另一个string对象
也可以为string对象赋一个字符串字面值常量
随机访问string中的字符:
用下标运算符可以访问string对象中指定位置的字符
string对象s的下标范围从0到s.size()-1
栈 (Stack)
stack是一种先进后出(First In Last Out, FILO)的数据结构,它只有一个出口,只能操作最顶端元素。
定义:stack<data_type> stack_name;
如:stack s;
操作:
empty() – 返回bool型,表示栈内是否为空 (s.empty() ) size() – 返回栈内元素个数 (s.size() )
top() – 返回栈顶元素值 (s.top() )
pop() – 移除栈顶元素(s.pop(); )
push(data_type a) – 向栈压入一个元素 a(s.push(a); )
队列(queue)
定义:queue <data_type> queue_name;
如:queue q;
操作:
empty() – 返回bool型,表示queue是否为空 (q.empty() )
size() – 返回queue内元素个数 (q.size() )
front() – 返回queue内的下一个元素 (q.front() )
back() – 返回queue内的最后一个元素(q.back() )
pop() – 移除queue中的一个元素(q.pop(); )
push(data_type a) – 将一个元素a置入queue中(q.push(a); )
queue是一种先进先出(First In First Out, FIFO)的数据结构,从底端加入元素,从顶端取出元素。vector的应用定义:vector <data_type> vector_name;
如:vector v;
操作:
empty() – 返回bool型,表示vector是否为空 (v.empty() )
size() – 返回vector内元素个数 (v.size() )
push_back(data_type a) 将元素a插入最尾端
pop_back() 将最尾端元素删除
v[i] 类似数组取第i个位置的元素(v[0] )
优先队列(priority_queue)
一个拥有权值观念的queue,自动依照元素的权值排列,权值最高排在前面。缺省情况下,priority_queue是利用一个max_heap完成的头文件: #include
定义:priority_queue <data_type> priority_queue_name;
如:priority_queue q;//默认是大顶堆
操作:
q.push(elem) 将元素elem置入优先队列
q.top() 返回优先队列的下一个元素
q.pop() 移除一个元素
q.size() 返回队列中元素的个数
q.empty() 返回优先队列是否为空
生成排列头文件: #include
bool next_permutation(begin, end);
改变区间内元素的顺序,产生下一个排列。
bool prev_permutation(begin, end);
产生前一个排列。
end为最后一个元素的下一个位置。upper_bound 和 lower_boundupper_bound(begin, end, value);
返回>value的元素的第一个位置。
lower_bound(begin, end, value);
返回>=value的元素的第一个位置。
set 和 multiset
set 和 multiset会根据特定的排序准则,自动将元素排序,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
操作:
s.insert(elem) – 安插一个elem副本,返回新元素位置。
s.erase(elem) – 移除与elem元素相等的所有元素,返回被移除 的元素个数。
s.erase(pos) – 移除迭代器pos所指位置上的元素,无返回值。sclear() – 移除全部元素,将整个容器清空。
s.size() – 返回容器大小。
s.empty() – 返回容器是否为空。
s.count(elem) – 返回元素值为elem的元素的个数。
s.lower_bound(elem) – 返回 元素值>= elem的第一个元素位置。
s.upper_bound(elem) – 返回元素值 > elem的第一个元素的位置。
以上位置均为一个迭代器。
s.begin() – 返回一个双向迭代器,指向第一个元素。s.end() – 返回一个双向迭代器,指向最后一个元素的下一 个位置。
map和multimap
map和multimap所有元素都会根据元素的键值自动排序,map的所有元素都是pair,pair的第一个元素被视为键值,第二个元素为实值。map不允许两个元素有相同的键值,但multimap可以。
头文件: #include