分类目录归档:未分类

一只玳瑁猫的教授

某天晚上心情郁闷,骑车出去逛逛,也没有设定目的地。在网上搜寻过北京冬夜里既暖和又能散步的去处,得到的答案大多是戏谑——人们推荐了工位:暖气充足,凌晨下班。

在北京的冬夜里,街上车流寥落,只有外卖骑手偶尔疾驰而过。路过一个熟悉的公园,园内小路无灯,借着公路漫进来的光,行人都成了模糊的剪影,彼此默契维持着距离。广场上倒是热闹,孩童的欢笑声搅动着空中的冷气。一座寺塔立在广场旁边,据说明代建成,在射灯下,昏黄的寺塔嵌在紫黑色的夜空前,显得格外孤寂。

走到尽头折返时,看见一只黑棕相间的玳瑁猫,瘦小,趴在草坪上,大约一岁。北京的冬夜能冻透骨头,想领养回去,但家里已有一只流浪猫,还跟两只原住民大打出手。又想起那逼仄的房子,还是作罢。这只玳瑁察觉我的凝视,冲我喵喵叫。我伸手摸去,它一蹬腿蹿上矮树。我试图凑近,它跳下走远。我只好作罢,退回石板路。

路上只剩我的脚步声,偶尔夹杂着枯叶碎裂的细响。回头看去,还是那小家伙,要不是那尾巴在动,很难发现树影下还藏着一团黑黢黢。我往前走,走几步发现它还跟着,已走到椅子下。慢慢,我朝它走去,它发现我突破安全距离,又跑回树下。不让摸,那我就走,但回头仍见那黑影悄悄跟着。走到开阔明亮的地方,小猫跟到路灯下,我再次缓慢走去,同时用人类最常用的猫语跟它套近乎。它叫了两句,四脚腾空像要起飞一样。我紧追不放,距离拉近它飞奔,距离过远它又趴在原地慵懒地等着我,仿佛在玩真正的躲猫猫。

在这场拉锯战中,我几次远离它,让它靠近,再迅速反击,均以失败告终。如果有路人远远看见,怕不是觉得这边闹鬼了。寒意不知不觉消散,我决定一鼓作气,看看它到底逃到哪里。等它又一次跟过来,我穷追不舍,这小黑球也发了狠,四只脚踩得树叶哗哗作响。眼见它敏捷地穿过一棵又一棵树,只恨笨拙的两脚兽身躯无法跟上。再定睛一看,面前一片枯黄的草丛,它一个猛子扎进去,传来阵阵唰唰声,越来越远,直到整个公园再次归于宁静,好像什么也不曾发生过。


题图:猫咪回头望

图片生成算法:Midjounery

Prompt:

An impressionistic oil painting with a thick impasto texture, depicting a tortoiseshell stray cat about to disappear into the yellow grass of a park. The cat is rendered as a blurred mass of dark brown brushstrokes, blending into the deep shadows of the low-lying grass and trees. Light emanates from a distant, dim streetlamp, casting faint beams that subtly illuminate scattered dry leaves and the cat’s silhouette. The overall scene is dim, dominated by a wintery, withered yellow palette with no green. The style combines characteristics of Claude Monet and Vincent van Gogh, rich in emotion and atmosphere, with visible brushstrokes, emotional depth, and expressionistic techniques.

平静就好

当年自习课,初中班主任面容严肃地把我们叫出来,说:你们是不是早恋了,你们这样要不得啊,你们能为对方的人生负责吗……毕业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;
                    }
                }