分类目录归档:未分类

平静就好

当年自习课,初中班主任面容严肃地把我们叫出来,说:你们是不是早恋了,你们这样要不得啊,你们能为对方的人生负责吗……毕业5年了,他老人家的音容笑貌还时不时地能吓我一跳。他上作文课常说人未必有才,但要有德。

我很感谢他。快高考的时候,我脱离学校一个多月,在朋友家自学,认为这样更加有效。读书、做习题、看视频课,呆在一个屋子里,多么可怕的生活,整个人就在一种焦虑的阴影中,某个黑色网页不知道怎么从贴吧跳了出来——高考xxxx,说的是借助什么高科技设备作弊,稳上xx学校。那一刻,我心动了,像挂在悬崖边上的人看见了蜂蜜。要有德,就没有作弊。

上次暑假,因为朋友的推荐,我去浙大上了暑校。作为一个一百本学生,我主要是去长见识的,课程是请了国外业界的泰斗,和大多数课程一样是用英文授课,你会看见学生挤挤攘攘在前排用电脑做笔记,会发现他们中午吃完饭就占座,在那里睡觉。看不清啊,肯定要早点去,不早就抢不到位置,前排是抢不到的,这辈子就都抢不到的,中间也一样,只有坐在摄像机的后面才能勉强维持学习的样子。我还在兢兢业业敲机器码,有人昨晚熬到两点写完了,有人写了反汇编用C语言写完,有人直接上课一小时就交了。

我那时候刚转专业到计算机,怀疑我是不是入错行了。在我校,一般后排才是宝座,如果上英语课,你会发现老师假装在讲,学生假装在听。如果不是要点名,我宁愿翘课学习。我庆幸我没作弊,万一上了xx学校,又怎么活得下来?

既然有比较,就会有审美,就会有高下。一个中人,在这种审美中必败,那又从哪里找到自己的安心呢?在金字塔上,也许塔尖的沙粒才会轻松。要是认为自己在比较级的世界,那么最高级的才有幸福。我们都知道,那全然不可能。一个人面对自我就像暴君,那么压榨自我也是迟早的事情了。我因此焦虑了,大概是从5个月前开始头痛。原因是坚持一个比赛,需要每天写代码到十点半。前三个月在误诊,后两个月我手拿五张医院卡,挂号排队拍ct,已然轻车熟路。

不知道是不是我以前没写英语作业,把数学本交上去凑数,接着趁机写完英语的缘故,这肯定是报应!Oh my gosh,我以我0.06吨的体重的发誓,我再也不敢了,希望能够平静下来。

按照心理学的观点,我应该接纳自己,鼓励自己,在我二十年的生活中坚持:

吃饭睡觉上厕所 —— 20年

上网 —— 从五年级去网吧玩QQ宠物记起,10年

看书 —— 从自己去书店偷看漫画,被老师误以为是热爱看书还送了读书劵记起,12年

这是一个多么单纯的青年,优点之多罄竹难书。这让我开始感谢班主任,他老人家说过要老老实实做人,平平淡淡做事。前者我是做不到了,今天起平静处事。

最后,我要写一句和全文没有半毛钱关系的话。我不晓得为什么我要那么写。但是这么写看起来,好像很高级的样子——一位大妈跳着广场舞,语重心长地说:小伙子啊,

这人呐,就得爱自己。

 


从前有一人获罪于王,畏罪潜逃,国王命令一只虎追他,这个人惊慌之中,堕入枯井,身体在半空时他发现井底有凶恶的龙,吐出毒汁,旁边还有五条毒蛇。于是他抓住一把草不放,免于坠井。可偏巧此时有黑、白二只老鼠啃他手中的草,草就要被啃断;醉象在头上,时刻准备用鼻子袭击他。就在恐怖万状时,又有了新情况,他头顶上有一棵树,树上有蜂窝,蜂蜜滴滴答答落到这个人的口中,甘甜清爽,使他暂忘危险处境。

C到C++的输入方式

Tips

  • 不要使用getch()和conio.h
  • 输出%d可以用printf(“%%d”);
  • printf(“\n”);输出n
  • “\n” 比 endl 快。

C语言输入函数

  • getchar函数接受所有字符包括回车。(单个字符)
  • gets函数是以回车符作为输入结束的标志,容易越界。

C++输入函数

bool eof(); 判断输入流是否结束
int peek(); 返回下一个字符,但不从流中去掉.
istream & putback(char c); 将字符ch放回输入流
istream & ignore( int nCount = 1, int delim = EOF ); 从流中删掉最多nCount个字符,遇到EOF时结束。

cin>>

结束条件:[enter],[space],[tab]
处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,不会移除[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]也只是将其放回缓冲区。
利用ios::sync_with_stdio(false);取消cin与stdin的同步可以更加快。

cin.getline

接受一个字符串,可以接收空格并输出。

char src[18];
cin.getline(src, 5);
cin.getline(src, 5, 'a');

结束条件:超过数量限制,输入[enter],或者输入自定义终止符。
处理方法:若超过限制,则其余字符不做处理。若输入[enter]或输入自定义终止符则移除(取其一)。
第一个函数默认只接收char*地址,且限制在4个字符以内。第5个是0。若输入1234回车,超过限制字符,cin.getline会把n从流中移除,输入其他字符则不会被移除。
第二个函数:结束条件为a与上述一致,直到输入a终止,此时a会被移除,n会继续留在流中。或者超过限制数量时,剩余的字符留在流中。
显然因为规定了限制数量,不会越界,比gets好多了。

cin.get

结束条件:输入字符足够后回车。或者输入自定义终止符。
函数的返回值就是读入的字符。 若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考虑到不与字符的ASCII代码混淆,但不同的C++系统所用的EOF值有可能不同。

char ch;
char src[18];
cin.get(ch);
cin.get(src, 5);
cin.get(src, 5, 'a');

第一个函数接受任意字符与getchar类似。
第二、三个函数与cin.getline类似。
显然不会越界。

cin.getline 与 cin.get 的区别

cin.get(arrayname,size)当遇到[enter]时会结束目前输入,不会删除缓冲区中的[enter]
cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,会删除缓冲区中的[enter]

cin.get(arrayname,size,s)当遇到s时会结束输入,不会删除缓冲区中的s
cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除

getline()

需要#incldue < string >

string s;
getline(cin, s);
getline(cin, s, 'a');
// input    -    获取数据来源的流
// str    -    放置数据的目标 string
// delim    -    分隔字符

适用于string类,和cin.getline一样会移除终止的[enter](第一个函数),或者移除a(第二个函数)。
(用std::basic_istream::operator>>释出)

从scanf说起

scanf(“”,)

1. %d格式输入,默认分隔符是所有的 white-spaces(空格、回车、制表);

2. %c格式输入,则按ASCII字符考虑,无分隔符。可能会受到之前输入的影响,必要时用fflush(stdin);清除缓冲区;

3. %s 是 字符串格式,默认分隔符是所有的 white-spaces,输入后自动加入结束符"\0"。

scanf函数的与后面的是必须严格匹配的。注意,是严格匹配,可以说不能有丝毫差别,但对于连续多个空格可以等同于一个空格。如:

scanf("%d, %d", &num1, &num2);  
scanf("%d,%d", &num1, &num2);  

第一条要想输入正确,必须输入一个整数,然后输入一个逗号(,),之后是第二个整数。最后是回车结束。
第二条语句中的中的两个%d之间没有空格,如果此时输入:12 ,13回车(12后面先有一个空格后由逗号),那么num2并不等于13。反过来,输入:“12”、“,”、“空格”、“13”,则不会出现错误。(自动跳过whitespace)

scanf("%d %d", &i, &j);

返回值是成功读取变量的个数,如果输入8 8.1 返回1,输入8 d返回1,输入d 8返回0。出错时则返回EOF。

scanf(" %c",&ch); 

%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。

scanf("%[A-Z]", s); //输入除A到Z的任何字符(包括空格、回车)都会停止。
scanf("%[^A-Z]", s);
scanf("%[^\n]", s);

第一条的意思是读入一个字符集合。[ ]是个集合的标志,%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。
如果集合的第一个字符是“^”,这说明读取不在”^”后面集合的字符,即遇到”^”后面集合的字符便停止。如第二条,为大写字母就停止。
第三天遇到回车停止。

scanf("%d ", &num);/*scanf("%d\n", &num);*/  

输入一个整数后,无论在输入多少个空格、回车、Tab,都没有输出;但是当再次输入非空白字符时,如输入2 然后输入空格然后输入4,最后输入回车,则会有输出。

scanf("%s", &s)

%s默认分隔符是所有的 white-spaces,输入后自动加入结束符”0″,使其成为一个字符串(之所以加上0,是和字符数组char[]的结束符有关的,C中是没有string这个类型的,是使用char[]结构实现字符串)。值得注意的是,即使输入字符的长度足够,%s是宁愿舍弃输入字符,也要把/0加上去的,作为字符串的结束。并且,scanf会忽略缓冲区开头的空格,直到遇到一个非空格字符,才开始向内存中读取数据。
想要输入”The C Programming Language.n”中间的空格怎么处理呢?
其中一个解决方法是使用gets函数,这个函数是以回车符作为输入结束的标志的;还有一种解决方式是:

scanf("%[^\n]", str);

scanf之后就可以将char[]转换为string,以防oj不对cin进行优化导致速度变慢的问题。

容器适配器 stack, queue, priority_queue

容器适配器

  • 可以用某种顺序容器来实现(让已有的顺序容器以栈/队列的方式工作)

1) stack: 头文件 < stack >
栈 — 后进先出
2) queue: 头文件 < queue >
队列 — 先进先出
3) priority_queue: 头文件 < queue >
优先级队列 — 最高优先级元素总是第一个出列

都有3个成员函数:

  • push: 添加一个元素;
  • top: 返回栈顶部或队头元素的引用
  • pop: 删除一个元素

容器适配器上没有迭代器——STL中各种排序, 查找, 变序等算法都不适合容器适配器

stack

  1. stack 是后进先出的数据结构
  2. 只能插入, 删除, 访问栈顶的元素
  3. 可用 vector, list, deque来实现

    • 缺省情况下, 用deque实现
    • 用 vector和deque实现, 比用list实现性能好
template
class stack {
…
};

stack 中主要的三个成员函数:

void push(const T & x);
将x压入栈顶
void pop();
弹出(即删除)栈顶元素
T & top();
返回栈顶元素的引用. 通过该函数, 可以读取栈顶
元素的值, 也可以修改栈顶元素

queue

  • 和stack 基本类似, 可以用 list和deque实现
  • 缺省情况下用deque实现
template
class queue {
……
};
  • 同样也有push, pop, top函数

    • push发生在队尾
    • pop, top发生在队头, 先进先出

priority_queue

  • 和 queue类似, 可以用vector和deque实现
  • 缺省情况下用vector实现
  • priority_queue 通常用堆排序技术实现, 保证最大的元
    素总是在最前面

    • 执行pop操作时, 删除的是最大的元素
    • 执行top操作时, 返回的是最大元素的引用
      默认的元素比较器是 less

函数对象

STL中的函数对象类模板
以下模板可以用来生成函数对象。
equal_to
greater
less
…….
头文件:

greater 函数对象类模板

template
struct greater : public binary_function {
bool operator()(const T& x, const T& y) const 
    {
    return x > y;
    }
};

greater 的应用

list 有两个sort成员函数

 void sort();

关联容器 Map和Multimap

multimap

template
class multimap {
….
typedef pair value_type;
…….
}; //Key 代表关键字的类型
  • multimap中的元素由 组成,每个元素是一个pair对象,关键字
    就是first成员变量,其类型是Key
  • multimap 中允许多个元素的关键字相同。元素按照first成员变量从小到大排列,缺省情况下用 less 定义关键字的“小于”关系。
#include 
#include 
using namespace std;

int main()
{
    typedef multimap mmid;
    mmid pairs;
    cout score;
            MAP_STD::iterator p=mp.lower_bound(score);
            //查找一个最大的位置it,是的[begin(),it)中所有元素的first都比value小。
            if(p!=mp.begin())
            {
                --p;
                score=p->first;
                //比要查询分数低的最高分
                MAP_STD::iterator maxp=p;
                int maxId=p->second.id;
                for(; p!=mp.begin()&&p->first==score; --p)
                {
                    //遍历所有成绩和score相等的学生
                    if(p->second.id>maxId)
                    {
                        maxp=p;
                        maxId=p->second.id;
                    }
                }
                if(p->first==score)
                {
                    //如果上面循环是因为p==mp.begin()
                    //而终止,则p指向的元素还要处理
                    if(p->second.id>maxId)
                    {
                        maxp=p;
                        maxId=p->second.id;
                    }
                }

关联容器 Set和Multiset

set和multiset

 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。

 除了各容器都有的函数外,还支持以下成员函数:

  • find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等)
  • lower_bound : 查找某个下界
  • upper_bound : 查找某个上界
  • equal_range : 同时查找上界和下界
  • count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)
  • insert: 用以插入一个元素或一个区间

multiset

template
class multiset { …… };
  • Pred类型的变量决定了multiset 中的元素,“一个比另一个小”是怎么定义的。multiset运行过程中,比较两个元素x,y的大小的做法,就是生成一个 Pred类型的变量,假定为 op,若表达式op(x,y) 返回值为true,则 x比y小。
    Pred的缺省类型是 less。
  • less 模板的定义:
template
struct less : public binary_function
{ bool operator()(const T& x, const T& y) { return x < y ; } const; };
//less模板是靠 < 来比较大小的

multiset 的成员函数

iterator find(const T & val);
// 在容器中查找值为val的元素,返回其迭代器。如果找不到,返回end()。

iterator insert(const T & val);
// 将val插入到容器中并返回其迭代器。

void insert( iterator first,iterator last); 
// 将区间[first,last)插入容器。

int count(const T & val);
//  统计有多少个元素的值和val相等。

iterator lower_bound(const T & val);
// 查找一个最大的位置 it,使得[begin(),it) 中所有的元素都比 val 小。

iterator upper_bound(const T & val);
// 查找一个最小的位置 it,使得[it,end()) 中所有的元素都比 val 大。

pair equal_range(const T & val);
// 同时求得lower_bound和upper_bound。

iterator erase(iterator it);
//删除it指向的元素,返回其后面的元素的迭代器(Visual studio 2010上如此,但是在C++标准和Dev C++中,返回值不是这样)。

multiset 的用法

#include 
#include 
#include 
using namespace std;

template
void Print(T first, T last)
{
    for(; first != last; first++)