[{"data":1,"prerenderedAt":877},["ShallowReactive",2],{"site-search-sections-zh":3,"site-mobile-menu-taxonomies-zh":668,"site-mobile-menu-page":723,"friends-taxonomies-zh":822},[4,17,24,30,37,43,49,55,66,71,77,83,89,95,101,107,111,116,121,126,137,142,148,154,160,165,170,175,181,187,193,199,205,210,216,222,228,234,240,246,252,258,264,270,276,282,288,294,300,306,312,318,326,332,338,344,350,356,362,372,378,392,399,406,413,420,427,434,441,448,455,462,469,476,483,490,497,504,511,519,526,533,540,547,554,561,568,575,582,588,600,608,614,626,632,640,651,657],{"path":5,"category":6,"tags":7,"created":11,"draft":12,"id":5,"title":13,"titles":14,"content":15,"level":16},"\u002Fabout","About",[8,9,10],"Computer Science","Blog","Life","2026-05-14",false,"关于 Leisuer",[],"Leisuer是谁？他从哪里来？他在做什么？他要做什么？ 这里是介绍我自己的页面，网站介绍请看关于本站。 我是Leisuer，在中国科学技术大学计算机科学与技术专业读大三，信仰共产主义。 我的父亲是湖南人，我的母亲是东北人（之后有机会的话我可以写一篇文章讲讲他们是怎么认识的～），我在吉林省吉林市出生长大，欢迎你们来吉林和湖南旅行！",1,{"path":5,"category":6,"tags":18,"created":11,"draft":12,"id":19,"title":20,"titles":21,"content":22,"level":23},[8,9,10],"\u002Fabout#兴趣爱好","兴趣爱好",[13],"骑行、手工、摄影、羽毛球、阅读、听歌、看动画 推理、悬疑爱好者 喜欢历史但缺乏系统性的知识和训练",2,{"path":5,"category":6,"tags":25,"created":11,"draft":12,"id":26,"title":27,"titles":28,"content":29,"level":23},[8,9,10],"\u002Fabout#计算机相关","计算机相关",[13],"几个比较感兴趣的方向： 大模型系统优化，训练和推理加速LLM agent、agentic RAG具身智能",{"path":5,"category":6,"tags":31,"created":11,"draft":12,"id":32,"title":33,"titles":34,"content":35,"level":36},[8,9,10],"\u002Fabout#关于前端","关于前端",[13,27],"一直很向往平面设计和UI\u002FUX设计，所以对前端也怀有一种好奇心。去年暑假的时候在b站上自学过三件套，除此之外再没有系统性学习过。好在有codex大人相助，我顺利vibe code出本网站，同时也学到了不少前端（特别是vue）知识。",3,{"path":5,"category":6,"tags":38,"created":11,"draft":12,"id":39,"title":40,"titles":41,"content":42,"level":23},[8,9,10],"\u002Fabout#高考之后曾设想的几个人生flag","高考之后曾设想的几个人生flag：",[13],"学做菜 学会游泳 学画画 掌握一门乐器 学开车",{"path":5,"category":6,"tags":44,"created":11,"draft":12,"id":45,"title":46,"titles":47,"content":48,"level":23},[8,9,10],"\u002Fabout#语言","语言",[13],"母语：中文 第一外语：英语（托福裸考95） 日语：跟着新标日和b站up学的，掌握的词汇和语法都非常有限，没时间学QAQ（但是片假名领域大神，音译能力max）韩语：四十音学了一点点，感谢饮冰老师教我如果以上全学会了（又在幻想了），下一步想学法语",{"path":5,"category":6,"tags":50,"created":11,"draft":12,"id":51,"title":52,"titles":53,"content":54,"level":23},[8,9,10],"\u002Fabout#by-the-way","By the way",[13],"我不太关注mbti以及类似的标签，但是如果你想知道的话，我之前测过是INFP，或许可以参考一下。",{"path":56,"category":6,"tags":57,"created":62,"draft":12,"id":56,"title":63,"titles":64,"content":65,"level":16},"\u002Fcolor-palette",[58,59,60,61],"Color","Theme","CSS","Design","2026-05-16","站点色彩方案",[],"Leisuer 博客当前使用的亮色、暗色与公用颜色整理。",{"path":56,"category":6,"tags":67,"created":62,"draft":12,"id":68,"title":63,"titles":69,"content":70,"level":16},[58,59,60,61],"\u002Fcolor-palette#站点色彩方案",[],"这篇文章整理了当前站点正在使用的颜色方案，按明亮模式、黑暗模式和公用颜色三类展示，便于后续统一主题、重构样式或补设计文档。",{"path":56,"category":6,"tags":72,"created":62,"draft":12,"id":73,"title":74,"titles":75,"content":76,"level":23},[58,59,60,61],"\u002Fcolor-palette#明亮模式","明亮模式",[63],"标识符色号--color-bg#eef7ff--color-text-main#111111--color-text-muted#666666--color-border#eaeaea--color-nav-bg#ffffff--color-surfacergb(255 255 255 \u002F 0.95)--color-surface-elevatedrgb(255 255 255 \u002F 0.98)--color-glass-bgrgb(255 255 255 \u002F 0.62)--color-glass-borderrgb(255 255 255 \u002F 0.7)--color-overlayrgb(15 23 42 \u002F 0.12)--color-shadowrgb(17 24 39 \u002F 0.12)--color-code-bg#f8fafc--color-code-header-bg#eef4fb--color-code-text#1e293b--color-code-border#dbe4ef--color-code-button-bgrgb(255 255 255 \u002F 0.96)--color-code-button-border#cbd5e1--color-code-button-text#475569--color-code-button-hover-bg#ffffff--color-code-button-hover-border#94a3b8--color-code-button-hover-text#0f172a--color-scrollbar-thumb-hoverrgb(59 130 246) --color-bg#eef7ff\n  \n  \n    \n    --color-text-main#111111\n  \n  \n    \n    --color-text-muted#666666\n  \n  \n    \n    --color-border#eaeaea\n  \n  \n    \n    --color-accent#53a3f1\n  \n  \n    \n    --color-nav-bg#ffffff",{"path":56,"category":6,"tags":78,"created":62,"draft":12,"id":79,"title":80,"titles":81,"content":82,"level":23},[58,59,60,61],"\u002Fcolor-palette#黑暗模式","黑暗模式",[63],"标识符色号--color-bg#0f141d--color-text-main#f5f7fb--color-text-muted#b4bfcc--color-borderrgb(255 255 255 \u002F 0.14)--color-nav-bgrgb(15 20 29 \u002F 0.92)--color-surfacergb(21 28 39 \u002F 0.92)--color-surface-elevatedrgb(24 32 45 \u002F 0.98)--color-glass-bgrgb(21 28 39 \u002F 0.6)--color-glass-borderrgb(255 255 255 \u002F 0.12)--color-overlayrgb(0 0 0 \u002F 0.3)--color-shadowrgb(0 0 0 \u002F 0.3)--color-code-bg#0f172a--color-code-header-bg#0b1220--color-code-text#e5e7eb--color-code-borderrgb(148 163 184 \u002F 0.22)--color-code-button-bgrgb(15 23 42 \u002F 0.92)--color-code-button-borderrgb(148 163 184 \u002F 0.45)--color-code-button-text#cbd5e1--color-code-button-hover-bgrgb(30 41 59 \u002F 0.96)--color-code-button-hover-borderrgb(203 213 225 \u002F 0.6)--color-code-button-hover-text#ffffff--color-scrollbar-thumb-hoverrgb(147 197 253) --color-bg#0f141d\n  \n  \n    \n    --color-text-main#f5f7fb\n  \n  \n    \n    --color-text-muted#b4bfcc\n  \n  \n    \n    --color-borderrgb(255 255 255 \u002F 0.14)\n  \n  \n    \n    --color-accent#53a3f1\n  \n  \n    \n    --color-nav-bgrgb(15 20 29 \u002F 0.92)",{"path":56,"category":6,"tags":84,"created":62,"draft":12,"id":85,"title":86,"titles":87,"content":88,"level":23},[58,59,60,61],"\u002Fcolor-palette#公用颜色","公用颜色",[63],"这些颜色在明亮模式和黑暗模式中保持一致。 标识符色号说明--color-accent#53a3f1站点主强调色，用于链接、标题装饰条、分类、标签与高亮状态--color-scrollbar-tracktransparent滚动条轨道--color-scrollbar-thumbrgb(96 165 250)滚动条滑块 --color-accent#53a3f1\n  \n  \n    \n    --color-scrollbar-tracktransparent\n  \n  \n    \n    --color-scrollbar-thumbrgb(96 165 250)",{"path":56,"category":6,"tags":90,"created":62,"draft":12,"id":91,"title":92,"titles":93,"content":94,"level":23},[58,59,60,61],"\u002Fcolor-palette#局部硬编码颜色","局部硬编码颜色",[63],"这些颜色不属于主题变量，但也确实出现在项目里。 色号用途#53a3f1搜索框聚焦边框、PWA 主题色、测试内容中的内联文字颜色#ffffff局部文字、局部背景、PWA 背景色#cbcbcb首页 Hero 大字中的浅灰文字#000遮罩渐变中的纯黑#ff5f57代码块顶部红色圆点#ffbd2e代码块顶部黄色圆点#28c840代码块顶部绿色圆点rgba(0, 0, 0, 0.1)Alert 组件阴影rgba(0, 0, 0, 0.15)Alert 组件悬停阴影 macOS Red#ff5f57\n  \n  \n    \n    macOS Yellow#ffbd2e\n  \n  \n    \n    macOS Green#28c840",{"path":56,"category":6,"tags":96,"created":62,"draft":12,"id":97,"title":98,"titles":99,"content":100,"level":23},[58,59,60,61],"\u002Fcolor-palette#备注","备注",[63],"整体上，这套颜色更像是以实际视觉效果为目标逐步微调出来的主题，而不是一开始就完全按严格 token 体系推导出的配色系统。因此会看到一些非常接近、但并不完全均匀的黑白灰与透明度组合。",{"path":102,"category":103,"tags":103,"created":103,"draft":12,"id":102,"title":104,"titles":105,"content":106,"level":16},"\u002F",null,"Welcome to Nuxt Content Starter",[],"This is the main page displaying Markdown located at content\u002Findex.md.",{"path":102,"category":103,"tags":103,"created":103,"draft":12,"id":108,"title":104,"titles":109,"content":110,"level":16},"\u002F#welcome-to-nuxt-content-starter",[],"This is the main page displaying Markdown located at content\u002Findex.md. Move to about page.",{"path":102,"category":103,"tags":103,"created":103,"draft":12,"id":112,"title":113,"titles":114,"content":115,"level":23},"\u002F#manage-your-contents","Manage your Contents",[104],"Create new pages or modify the existing ones in content\u002F directory.",{"path":102,"category":103,"tags":103,"created":103,"draft":12,"id":117,"title":118,"titles":119,"content":120,"level":23},"\u002F#query-render-pages","Query & Render Pages",[104],"You can find an example of querying contents and rendering them in a catch-all page",{"path":102,"category":103,"tags":103,"created":103,"draft":12,"id":122,"title":123,"titles":124,"content":125,"level":23},"\u002F#integrate-vue-component","Integrate Vue Component",[104],"The current alert and the counter below are Vue components integrated into the Markdown. Checkout out the documentation to learn more.",{"path":127,"category":128,"tags":129,"created":11,"draft":12,"id":127,"title":134,"titles":135,"content":136,"level":16},"\u002Fmarkdown-test","Test",[130,131,132,133],"Markdown","Nuxt Content","MDC","Syntax","Markdown Syntax Test",[],"A stress-test document for common Markdown, GFM, HTML, and Nuxt Content MDC syntax.",{"path":127,"category":128,"tags":138,"created":11,"draft":12,"id":139,"title":134,"titles":140,"content":141,"level":16},[130,131,132,133],"\u002Fmarkdown-test#markdown-syntax-test",[],"This document is a playground for testing Markdown rendering. It intentionally includes many edge cases and visual patterns. Jump to tables · Jump to code · Jump to MDC",{"path":127,"category":128,"tags":143,"created":11,"draft":12,"id":144,"title":145,"titles":146,"content":147,"level":23},[130,131,132,133],"\u002Fmarkdown-test#paragraphs-and-line-breaks","Paragraphs And Line Breaks",[134],"This is a normal paragraph. It contains enough text to wrap across multiple lines so spacing, line height, and width can be inspected in the renderer. This is another paragraph after a blank line. This line ends with two spaces.\nThis should render as a soft line break. This line uses an HTML break.\nThis should also appear on the next line.",{"path":127,"category":128,"tags":149,"created":11,"draft":12,"id":150,"title":151,"titles":152,"content":153,"level":23},[130,131,132,133],"\u002Fmarkdown-test#inline-formatting","Inline Formatting",[134],"This sentence has bold text, italic text, bold italic text, strikethrough text, inline code, and a normal link. Autolinks should work too: https:\u002F\u002Fexample.com and hello@example.com. Escaped characters: *not italic*, # not a heading, [not a link].",{"path":127,"category":128,"tags":155,"created":11,"draft":12,"id":156,"title":157,"titles":158,"content":159,"level":23},[130,131,132,133],"\u002Fmarkdown-test#headings","Headings",[134],"",{"path":127,"category":128,"tags":161,"created":11,"draft":12,"id":162,"title":163,"titles":164,"content":159,"level":16},[130,131,132,133],"\u002Fmarkdown-test#heading-1","Heading 1",[],{"path":127,"category":128,"tags":166,"created":11,"draft":12,"id":167,"title":168,"titles":169,"content":159,"level":23},[130,131,132,133],"\u002Fmarkdown-test#heading-2","Heading 2",[163],{"path":127,"category":128,"tags":171,"created":11,"draft":12,"id":172,"title":173,"titles":174,"content":159,"level":36},[130,131,132,133],"\u002Fmarkdown-test#heading-3","Heading 3",[163,168],{"path":127,"category":128,"tags":176,"created":11,"draft":12,"id":177,"title":178,"titles":179,"content":159,"level":180},[130,131,132,133],"\u002Fmarkdown-test#heading-4","Heading 4",[163,168,173],4,{"path":127,"category":128,"tags":182,"created":11,"draft":12,"id":183,"title":184,"titles":185,"content":159,"level":186},[130,131,132,133],"\u002Fmarkdown-test#heading-5","Heading 5",[163,168,173,178],5,{"path":127,"category":128,"tags":188,"created":11,"draft":12,"id":189,"title":190,"titles":191,"content":159,"level":192},[130,131,132,133],"\u002Fmarkdown-test#heading-6","Heading 6",[163,168,173,178,184],6,{"path":127,"category":128,"tags":194,"created":11,"draft":12,"id":195,"title":196,"titles":197,"content":198,"level":23},[130,131,132,133],"\u002Fmarkdown-test#blockquotes","Blockquotes",[163],"This is a simple blockquote. This is a multi-paragraph blockquote.It has a second paragraph. Nested blockquote:This is nested one level deeper.This is nested two levels deeper. Blockquote with formatting:Bold list iteminline codeA link",{"path":127,"category":128,"tags":200,"created":11,"draft":12,"id":201,"title":202,"titles":203,"content":204,"level":23},[130,131,132,133],"\u002Fmarkdown-test#custom-containers","Custom Containers",[163],"Here's some additional information. Here's a helpful suggestion. Be careful with this action as it might have unexpected results. This action cannot be undone. This content is hidden until the container is opened. This content is visible by default and can be collapsed.",{"path":127,"category":128,"tags":206,"created":11,"draft":12,"id":207,"title":208,"titles":209,"content":159,"level":23},[130,131,132,133],"\u002Fmarkdown-test#lists","Lists",[163],{"path":127,"category":128,"tags":211,"created":11,"draft":12,"id":212,"title":213,"titles":214,"content":215,"level":36},[130,131,132,133],"\u002Fmarkdown-test#unordered-lists","Unordered Lists",[163,208],"First itemSecond item\nNested item ANested item B\nDeep nested itemThird item Asterisk itemAnother asterisk item Plus itemAnother plus item",{"path":127,"category":128,"tags":217,"created":11,"draft":12,"id":218,"title":219,"titles":220,"content":221,"level":36},[130,131,132,133],"\u002Fmarkdown-test#ordered-lists","Ordered Lists",[163,208],"First ordered itemSecond ordered itemThird ordered itemNumbering can all be one.Markdown should still render it correctly.Useful for editing.",{"path":127,"category":128,"tags":223,"created":11,"draft":12,"id":224,"title":225,"titles":226,"content":227,"level":36},[130,131,132,133],"\u002Fmarkdown-test#mixed-lists","Mixed Lists",[163,208],"Ordered item\nNested unordered itemAnother nested unordered itemAnother ordered item\nNested ordered itemAnother nested ordered item",{"path":127,"category":128,"tags":229,"created":11,"draft":12,"id":230,"title":231,"titles":232,"content":233,"level":36},[130,131,132,133],"\u002Fmarkdown-test#task-lists","Task Lists",[163,208],"Completed task Incomplete task Task with bold text Task with inline code",{"path":127,"category":128,"tags":235,"created":11,"draft":12,"id":236,"title":237,"titles":238,"content":239,"level":23},[130,131,132,133],"\u002Fmarkdown-test#tables","Tables",[163],"Left alignedCenter alignedRight alignedAlphaBeta123Long content that wrapsBold and code456.78LinkExample999 FeatureStatusNotesParagraphsWorksBasic text renderingListsWorksNested and task listsCodeWorksInline and fenced",{"path":127,"category":128,"tags":241,"created":11,"draft":12,"id":242,"title":243,"titles":244,"content":245,"level":23},[130,131,132,133],"\u002Fmarkdown-test#code-blocks","Code Blocks",[163],"Inline code: const answer = 42. Indented code: const indented = true\nconsole.log(indented) Plain fenced code: No language here.\nJust plain text. TypeScript: console.log(\"hello\") JavaScript with filename: export default defineComponent({}) type Post = {\n  title: string\n  tags: string[]\n  draft?: boolean\n}\n\nconst post: Post = {\n  title: 'Markdown Syntax Test',\n  tags: ['markdown', 'nuxt-content'],\n} Code with Line Numbers: function calculateSum(a, b) {\n  const result = a + b;\n  console.log(\"Sum:\", result);\n  return result;\n} Line Numbers with Filename: const sum = (a: number, b: number) => a + b Line Numbers with Start: console.log(\"first visible line\")\nconsole.log(\"second visible line\") Vue: \u003Cscript setup lang=\"ts\">\nconst message = 'Hello Markdown'\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cp>{{ message }}\u003C\u002Fp>\n\u003C\u002Ftemplate> Bash: npm run dev\nnpm run build Diff: - const oldTheme = 'light'\n+ const newTheme = 'dark' JSON: {\n  \"title\": \"Markdown Syntax Test\",\n  \"draft\": true,\n  \"tags\": [\"Markdown\", \"Nuxt Content\"]\n} Code Group (Nuxt Content MDC): npm install\nyarn install\npnpm install",{"path":127,"category":128,"tags":247,"created":11,"draft":12,"id":248,"title":249,"titles":250,"content":251,"level":23},[130,131,132,133],"\u002Fmarkdown-test#horizontal-rules","Horizontal Rules",[163],"Three hyphens: Three asterisks: Three underscores:",{"path":127,"category":128,"tags":253,"created":11,"draft":12,"id":254,"title":255,"titles":256,"content":257,"level":23},[130,131,132,133],"\u002Fmarkdown-test#images","Images",[163],"Local image: Image with title: Linked image:",{"path":127,"category":128,"tags":259,"created":11,"draft":12,"id":260,"title":261,"titles":262,"content":263,"level":36},[130,131,132,133],"\u002Fmarkdown-test#markdown-image-width-tests","Markdown Image Width Tests",[163,255],"Plain Markdown image: Markdown image with Nuxt MDC width and height attributes: Markdown image with class attributes: Markdown image with Tailwind arbitrary width class: Wide Markdown image: Wide Markdown image constrained by class: Markdown linked image: Missing image: Missing image with title: Missing image with explicit size:",{"path":127,"category":128,"tags":265,"created":11,"draft":12,"id":266,"title":267,"titles":268,"content":269,"level":23},[130,131,132,133],"\u002Fmarkdown-test#links","Links",[163],"Inline link: Nuxt Reference link: Nuxt Content Another reference link: Example",{"path":127,"category":128,"tags":271,"created":11,"draft":12,"id":272,"title":273,"titles":274,"content":275,"level":23},[130,131,132,133],"\u002Fmarkdown-test#footnotes","Footnotes",[163],"Here is a sentence with a footnote.1 Here is another footnote with more text.2",{"path":127,"category":128,"tags":277,"created":11,"draft":12,"id":278,"title":279,"titles":280,"content":281,"level":23},[130,131,132,133],"\u002Fmarkdown-test#html","HTML",[163],"Native details elementThis content is inside a native HTML details block. ⌘ + K Highlighted text using HTML mark. Inline HTML span with custom color.",{"path":127,"category":128,"tags":283,"created":11,"draft":12,"id":284,"title":285,"titles":286,"content":287,"level":23},[130,131,132,133],"\u002Fmarkdown-test#escaping-and-entities","Escaping And Entities",[163],"HTML entities: © — → \u003Cdiv> Backslash escaping: `not code` **not bold**",{"path":127,"category":128,"tags":289,"created":11,"draft":12,"id":290,"title":291,"titles":292,"content":293,"level":23},[130,131,132,133],"\u002Fmarkdown-test#definition-like-text","Definition-Like Text",[163],"Term\n: Definition syntax may or may not be supported depending on the Markdown parser. Another Term\n: Another definition body.",{"path":127,"category":128,"tags":295,"created":11,"draft":12,"id":296,"title":297,"titles":298,"content":299,"level":23},[130,131,132,133],"\u002Fmarkdown-test#math-like-text","Math-Like Text",[163],"Inline math-like text: $E = mc^2$ Block math-like text: $$\nE = mc^2\n$$ This section is here to verify whether math is supported or rendered as plain text.",{"path":127,"category":128,"tags":301,"created":11,"draft":12,"id":302,"title":303,"titles":304,"content":305,"level":23},[130,131,132,133],"\u002Fmarkdown-test#nuxt-content-mdc","Nuxt Content MDC",[163],"The following syntax tests Nuxt Content MDC. Rendering depends on available components. This is an MDC block using the Alert component if it is registered. This alert passes props. This is a raw MDC div container with classes. Inline Badge Card TitleCard content with Markdown inside.",{"path":127,"category":128,"tags":307,"created":11,"draft":12,"id":308,"title":309,"titles":310,"content":311,"level":23},[130,131,132,133],"\u002Fmarkdown-test#long-content","Long Content",[163],"This section intentionally adds repeated paragraphs so scroll behavior, anchors, and table of contents behavior can be tested. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus, justo vitae aliquet porta, lectus augue blandit nisl, vitae tempor ipsum arcu a erat. Praesent commodo, magna vitae ullamcorper tristique, ipsum nibh efficitur justo, id volutpat sem ex nec massa. Curabitur posuere sapien ut ipsum luctus, sed feugiat mi porta. Donec feugiat, magna id dignissim dictum, velit mi rhoncus ipsum, vitae aliquet sapien augue sit amet odio.",{"path":127,"category":128,"tags":313,"created":11,"draft":12,"id":314,"title":315,"titles":316,"content":317,"level":23},[130,131,132,133],"\u002Fmarkdown-test#final-section","Final Section",[163],"If anchor links work correctly, clicking a heading anchor above should not unexpectedly jump here. End of test document. FootnotesThis is the first footnote. ↩This is a longer footnote.\nIt can contain multiple lines when indented. ↩ html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"path":319,"category":6,"tags":320,"created":322,"draft":12,"id":319,"title":323,"titles":324,"content":325,"level":16},"\u002Fposts\u002Fabout-site",[9,321,61],"Site","2026-05-27","关于本站",[],"网站的设立初衷、灵感来源、技术实现与未来规划。",{"path":319,"category":6,"tags":327,"created":322,"draft":12,"id":328,"title":329,"titles":330,"content":331,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#为什么要做个人网站","为什么要做个人网站",[323],"因为想做，所以就做了。 我想有一个能展示自己的平台，而大概没有什么比一个独属于自己的网站更酷了吧。另一方面，我也想把它当作一个练习场，用来尝试和展示我头脑中的一些 UI\u002FUX 设计灵感（不过目前还没放上来）。最后，当然也想通过写博客记录一些想法和生活——虽然不确定能否坚持，但这里总归是一个比社交媒体更自在的地方。",{"path":319,"category":6,"tags":333,"created":322,"draft":12,"id":334,"title":335,"titles":336,"content":337,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#为什么不用现成的博客框架和模板","为什么不用现成的博客框架和模板",[323],"如前面所说，我主要是想有一个能完全按自己想法设计和实现的空间来展示自己，博客并不是重点。我不想被禁锢在专为博客设计的模式里，也不希望被别人的页面框架拘束手脚。当然，本网站目前的 UI 参考了多个优秀网站的设计，但我可以自由选用和改造这些元素，而不用被某个特定模板束缚。",{"path":319,"category":6,"tags":339,"created":322,"draft":12,"id":340,"title":341,"titles":342,"content":343,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#参考和借鉴","参考和借鉴",[323],"fuwari：一个超级有影响力的开源博客模板，许多模板或是直接基于fuwari修改，或是参考了fuwari的风格。本站整体的设计和布局都受到了fuwari的启发。astro-koharu：一个astro博客主题，本站页面的信息排版和细节处理有参考该项目，同时本站默认封面图是直接从该项目照搬而来。apple.com：本项目的设计也受到苹果、Openai官网等同类简洁优雅网站的启发。多年来浏览并被潜移默化影响过的诸多站点（如bilibili、知乎）",{"path":319,"category":6,"tags":345,"created":322,"draft":12,"id":346,"title":347,"titles":348,"content":349,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#现在有什么","现在有什么",[323],"目前本站主要包括这些部分和功能： hero区：一个醒目到有些浮夸的门面，向访客问好：\"Hi, I'm Leisuer\"。文字背景来源于本人所拍摄的照片，有循环位移的动画效果。站点名片和索引markdown及其扩展功能支持文章目录和阅读进度追踪响应式布局和移动端适配：为不同尺寸和比例的设备分别设计布局样式移动端菜单栏：包含了导航栏、站点名片索引和文章目录的功能用以作为替代归档：按时间整理所有文章分类和标签：按主题整理文章收藏：放一些也许会有用的网站友链：保留和其他站点之间的连接搜索：快速找到内容随机推荐i18n：简中、繁中、英文、日语四种语言支持暗黑模式：可以在亮色和暗色主题之间切换，且有丝滑的过渡动画丝滑的过渡动画和细节交互背景的鼠标追踪视差动画背景樱花飘落css动画",{"path":319,"category":6,"tags":351,"created":322,"draft":12,"id":352,"title":353,"titles":354,"content":355,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#技术实现","技术实现",[323],"本站基于 Nuxt 4 开发，内容部分使用 Nuxt Content 管理。样式方面主要使用 Tailwind CSS v4 和少量按模块拆分的 CSS。 内容检索和整理主要依赖 Nuxt Content 的查询能力。归档按发布时间分组，分类和标签会从文章 frontmatter 中自动统计生成；搜索则基于 Nuxt Content 的搜索 section 数据，在本地对标题、正文、路径、分类和标签做匹配与排序。这样新增文章时，只要 frontmatter 写对，相关页面就会自动更新。",{"path":319,"category":6,"tags":357,"created":322,"draft":12,"id":358,"title":359,"titles":360,"content":361,"level":23},[9,321,61],"\u002Fposts\u002Fabout-site#未来计划","未来计划",[323],"添加页面切换加载动画 持续发文 优化细节 更完美的静态生成或对接后端 文章切换上一篇下一篇 评论区 RSS订阅",{"path":363,"category":61,"tags":364,"created":368,"draft":12,"id":363,"title":369,"titles":370,"content":371,"level":16},"\u002Fposts\u002Fcover-card-demo",[365,366,367],"Cover","Image","Visual","2026-05-10","带封面的文章卡片示例",[],"这篇用来测试文章封面、摘要和底部标签同时出现时的整体节奏。 封面可以让文章列表更有层次，但也会压缩文字区域的横向空间。因此这篇文章用来确认有封面时，元信息、标题和摘要是否仍然清晰。",{"path":363,"category":61,"tags":373,"created":368,"draft":12,"id":374,"title":375,"titles":376,"content":377,"level":23},[365,366,367],"\u002Fposts\u002Fcover-card-demo#封面","封面",[369],"之后可以为真实文章挑选更贴合内容的封面图。",{"path":379,"category":380,"tags":383,"created":388,"draft":12,"id":379,"title":389,"titles":390,"content":391,"level":16},"\u002Fposts\u002Fcpp-learning\u002Fcpp-1",[381,382],"Notes","C++复健笔记",[384,385,386,387],"C++","算法","机考","学习笔记","2026-05-28","C++复健笔记 Vol.1：重新开始手写代码",[],"AI很好用，但机考不会替我敲键盘。这个系列用来记录我在夏令营机考前重新找回C++手感的过程。",{"path":379,"category":393,"tags":394,"created":388,"draft":12,"id":395,"title":396,"titles":397,"content":398,"level":23},[381,382],[384,385,386,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-1#前言","前言",[389],"由于现在 AI 发展迅速（AI 太好用了你们知道吗），我已经很少手写代码了。再加上大学程序设计课程学的是 C 语言，我现在可能实际上不怎么能手写 C++ 代码。 然而夏令营机考将至，本人不得不复习一下如何写 C++ 代码。程序员一定要会写程序。 所以，我打算写一系列文章，记录一下我复健的过程。",{"path":379,"category":400,"tags":401,"created":388,"draft":12,"id":402,"title":403,"titles":404,"content":405,"level":23},[381,382],[384,385,386,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-1#这个系列打算写什么","这个系列打算写什么",[389],"这个系列不是系统的 C++ 教程，也不是算法竞赛从入门到入土。它就只是一份复健日志：记录我从“知道应该怎么写”重新回到“手能自然写出来”的过程。 我希望每篇文章都解决一个很小的问题，比如： 常用输入输出和模板怎么写；vector、string、map、set 这些 STL 容器怎么快速上手；排序、二分、前缀和、双指针这些常见套路怎么写；BFS、DFS、最短路、并查集这些基础算法怎么恢复肌肉记忆；机考时怎样减少低级错误。 目标不是写出多么优雅的工程代码，而是在有限时间里写出正确、清楚、能通过样例和测试点的程序。",{"path":379,"category":407,"tags":408,"created":388,"draft":12,"id":409,"title":410,"titles":411,"content":412,"level":23},[381,382],[384,385,386,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-1#第一件事你好世界","第一件事：你好，世界",[389],"我知道你很急，但是你先别急。就像是学编程语言第一件事是写“Hello, World!”一样，复健当然也可以从这里开始。 #include \u003Ciostream>\nusing namespace std;\n\nint main() {\n    cout \u003C\u003C \"Hello, World!\" \u003C\u003C endl;\n    return 0;\n} 不过机考时，可以用下面这个版本： #include \u003Cbits\u002Fstdc++.h>\nusing namespace std;\n\nint main() {\n    ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n    cout \u003C\u003C \"Hello, World!\" \u003C\u003C endl;\n    return 0;\n} #include \u003Cbits\u002Fstdc++.h> 是算法题里常见的“全家桶”头文件，能省掉很多按需引入标准库的时间；ios::sync_with_stdio(false); 和 cin.tie(nullptr); 用来加速输入输出。我在练习时尽量不用这个写法，以免忘记需要 #include 什么头文件。",{"path":379,"category":414,"tags":415,"created":388,"draft":12,"id":416,"title":417,"titles":418,"content":419,"level":23},[381,382],[384,385,386,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-1#顺手写一个小题","顺手写一个小题",[389],"为了让手动起来，先写一个最普通的问题：读入 n 个整数，输出它们的和、最大值和最小值。 #include \u003Ciostream>\n#include \u003Cvector>\nusing namespace std;\n\nint main(){\n    int n;\n    cin >> n;\n    vector\u003Cint> arr(n);\n    for(int i = 0; i \u003C n; i++){\n        cin >> arr[i];\n    }\n    long long sum = 0;\n    int min = arr[0];\n    int max = arr[0];\n    for(int i = 0; i \u003C n; i++){\n        sum += arr[i];\n        if(arr[i] \u003C min){\n            min = arr[i];\n        }\n        if(arr[i] > max){\n            max = arr[i];\n        }\n    }\n    cout \u003C\u003C \"Sum: \" \u003C\u003C sum \u003C\u003C '\\n';\n    cout \u003C\u003C \"Min: \" \u003C\u003C min \u003C\u003C '\\n';\n    cout \u003C\u003C \"Max: \" \u003C\u003C max \u003C\u003C '\\n';\n    return 0;\n} 这题本身当然不难，但它可以提醒我几件事： 求和最好用 long long，避免整数范围不够。初始化最大值和最小值时，可以直接用第一个元素。输出换行用 '\\n'，不要在大量输出里滥用 endl。能用范围 for 的时候，代码会清爽很多。",{"path":379,"category":421,"tags":422,"created":388,"draft":12,"id":423,"title":424,"titles":425,"content":426,"level":23},[381,382],[384,385,386,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-1#下一步","下一步",[389],"下一篇大概会从熟悉指针和引用开始。 希望这个系列写到后面，我能真正摆脱AI大人的喂饭，学会自己走路。加油！ html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"path":428,"category":429,"tags":430,"created":388,"draft":12,"id":428,"title":431,"titles":432,"content":433,"level":16},"\u002Fposts\u002Fcpp-learning\u002Fcpp-2",[381,382],[384,387],"C++复健笔记 Vol.2：指针和引用",[],"从 C 的指针语义过渡到 C++ 引用语义，顺手复习空指针、野指针、数组退化、const 引用和右值引用。 书接上回，在写了两个非常简单的宝宝巴士程序后，今天来点儿幼儿园巴士：指针和引用。",{"path":428,"category":435,"tags":436,"created":388,"draft":12,"id":437,"title":438,"titles":439,"content":440,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#地址与指针","地址与指针",[431],"先从取地址开始。 #include \u003Ciostream>\nusing namespace std;\n\nint main() {\n    int x = 42;\n\n    cout \u003C\u003C x \u003C\u003C '\\n';\n    cout \u003C\u003C &x \u003C\u003C '\\n';\n\n    return 0;\n} &x 取到的是 x 的地址。指针变量可以保存这个地址，再通过解引用访问它指向的对象。 int x = 42;\nint* p = &x;\n\n*p = 100; \u002F\u002F x == 100 这里几个符号的含义是： &x：取 x 的地址。int* p：p 是指向 int 的指针。*p：访问 p 指向的对象。p + 1：移动到下一个 int 的位置，不是地址数值简单加 1。 函数参数如果按值传递，只会修改副本；如果传地址，就能修改外部对象。 void inc(int* p) {\n    (*p)++;\n}\n\nint x = 0;\ninc(&x); \u002F\u002F x == 1 这里必须写 (*p)++。",{"path":428,"category":442,"tags":443,"created":388,"draft":12,"id":444,"title":445,"titles":446,"content":447,"level":36},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#如果写成-p","如果写成 *p++",[431,438],"后置 ++ 的优先级比解引用 * 高。 它做的是： 先取当前 p 指向的值然后让指针 p 自己往后移动一个 int 的位置但取出来的那个值没有被修改 几个容易混的式子： (*p)++; \u002F\u002F 指向的值后置自增\n++*p;   \u002F\u002F 指向的值前置自增，等价于 ++(*p)\n*p++;   \u002F\u002F 取当前值，然后 p 后移，等价于 *(p++)\n*++p;   \u002F\u002F p 先后移，再取新位置的值",{"path":428,"category":449,"tags":450,"created":388,"draft":12,"id":451,"title":452,"titles":453,"content":454,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#空指针和野指针","空指针和野指针",[431],"现代 C++ 用 nullptr 表示空指针。 int* p = nullptr;\n\nif (p != nullptr) {\n    cout \u003C\u003C *p \u003C\u003C '\\n';\n} 空指针可以比较，不能解引用。 野指针一般来自两类情况。第一种是未初始化： int* p;     \u002F\u002F 未初始化\n*p = 10;    \u002F\u002F UB 第二种是指向已经失效的位置，比如返回局部变量地址： int* bad() {\n    int x = 10;\n    return &x; \u002F\u002F 返回局部变量地址\n} 指针声明时初始化，不知道指向谁就设为 nullptr。解引用前确认指针有效。不返回局部变量地址。能用引用或容器时，不为了“像 C”而手写裸指针。",{"path":428,"category":456,"tags":457,"created":388,"draft":12,"id":458,"title":459,"titles":460,"content":461,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#数组与指针","数组与指针",[431],"数组名在很多表达式里会退化为指向首元素的指针。 int a[3] = {10, 20, 30};\n\ncout \u003C\u003C *a \u003C\u003C '\\n';       \u002F\u002F 10\ncout \u003C\u003C *(a + 1) \u003C\u003C '\\n'; \u002F\u002F 20\ncout \u003C\u003C a[2] \u003C\u003C '\\n';     \u002F\u002F 30 a[i] 可以理解成 *(a + i)。但数组不是指针本身： int a[3] = {10, 20, 30};\nint* p = a;\n\ncout \u003C\u003C sizeof(a) \u003C\u003C '\\n'; \u002F\u002F 3 * sizeof(int)\ncout \u003C\u003C sizeof(p) \u003C\u003C '\\n'; \u002F\u002F sizeof(int*) 函数参数里的数组比较特殊： void f(int a[]) {\n    cout \u003C\u003C sizeof(a) \u003C\u003C '\\n'; \u002F\u002F 这里 a 已经是 int*\n} 也就是说，数组作为函数参数时会退化成指针，长度信息会丢掉。机考里如果没有特殊需求，我还是优先用 vector，省掉手动传长度和越界风险。",{"path":428,"category":463,"tags":464,"created":388,"draft":12,"id":465,"title":466,"titles":467,"content":468,"level":36},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#指针数组和数组指针","指针数组和数组指针",[431,459],"非常适合拿来折磨人。 指针数组：本质是数组，数组里的每个元素都是指针。 int a = 1;\nint b = 2;\nint c = 3;\n\nint* p[3] = {&a, &b, &c};\n\ncout \u003C\u003C *p[0] \u003C\u003C '\\n'; \u002F\u002F 1 p 先和 [3] 结合，所以 p 是一个数组；数组元素类型是 int*。 数组指针：本质是指针，指向一个数组。 int arr[3] = {1, 2, 3};\n\nint (*p)[3] = &arr;\n\ncout \u003C\u003C (*p)[0] \u003C\u003C '\\n'; \u002F\u002F 1\ncout \u003C\u003C (*p)[2] \u003C\u003C '\\n'; \u002F\u002F 3 这里括号不能省。如果写成： int* p[3]; 那就是指针数组；写成： int (*p)[3]; 才是数组指针。 数组指针如果作为函数返回值，声明会更难认： int (*getArray())[3] {\n    static int arr[3] = {1, 2, 3};\n    return &arr;\n} 这里 getArray 是一个函数，它返回 int (*)[3]，也就是“指向含 3 个 int 的数组的指针”。调用时可以这样写： int (*p)[3] = getArray();\n\ncout \u003C\u003C (*p)[0] \u003C\u003C '\\n'; 这种声明可读性比较差。实际写 C++ 时可以用 using 起别名： using IntArray3 = int[3];\n\nIntArray3* getArray() {\n    static int arr[3] = {1, 2, 3};\n    return &arr;\n} 这样就清楚很多：getArray 返回的是 IntArray3*。",{"path":428,"category":470,"tags":471,"created":388,"draft":12,"id":472,"title":473,"titles":474,"content":475,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#引用","引用",[431],"引用可以理解成对象的别名。它声明时必须绑定，之后不能改绑。 int x = 42;\nint& r = x;\n\nr = 100; \u002F\u002F x == 100 引用传参可以替代很多“传指针进去改外部变量”的写法： void inc(int& x) {\n    x++;\n}\n\nint a = 0;\ninc(a); \u002F\u002F a == 1 和指针传参对比： void inc1(int* p) { (*p)++; }\nvoid inc2(int& x) { x++; }\n\ninc1(&a);\ninc2(a); 引用版本更像普通变量，调用点也更干净；指针版本则能显式表达“可能为空”“可能改指向”等语义。机考里的普通修改参数，引用通常更顺。 作为练习，我手写了两个版本的 swap。 引用版本： void swap(int& a, int& b) {\n    int t = a;\n    a = b;\n    b = t;\n} 指针版本： void swap(int* a, int* b) {\n    int t = *a;\n    *a = *b;\n    *b = t;\n} 调用点区别也很清楚： int x = 1;\nint y = 2;\n\nswap(x, y);   \u002F\u002F 引用版本\nswap(&x, &y); \u002F\u002F 指针版本 当然真正写题时直接用标准库： swap(a, b);",{"path":428,"category":477,"tags":478,"created":388,"draft":12,"id":479,"title":480,"titles":481,"content":482,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#范围-for-里的引用","范围 for 里的引用",[431],"范围 for 默认按值拷贝。 vector\u003Cint> a = {1, 2, 3};\n\nfor (int x : a) {\n    x *= 2;\n}\n\n\u002F\u002F a 仍然是 {1, 2, 3} 要修改原容器元素： for (int& x : a) {\n    x *= 2;\n} 只读且避免拷贝： for (const string& s : names) {\n    cout \u003C\u003C s \u003C\u003C '\\n';\n} 这里的判断可以简单一点： 小类型只读：int x需要修改：T& x大对象只读：const T& x",{"path":428,"category":484,"tags":485,"created":388,"draft":12,"id":486,"title":487,"titles":488,"content":489,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#const-引用","const 引用",[431],"const T& 是 C++ 函数参数里非常常见的写法：避免拷贝，同时承诺不修改。 long long sum(const vector\u003Cint>& a) {\n    long long ans = 0;\n    for (int x : a) {\n        ans += x;\n    }\n    return ans;\n} 如果写成： long long sum(vector\u003Cint> a) 会复制整个 vector。数据量一大，这种拷贝没有必要。 const 和指针放在一起时也需要恢复一下： const int* p1;       \u002F\u002F 指向 const int，不能通过 p1 改值，p1 可改指向\nint* const p2 = &x;  \u002F\u002F const 指针，p2 不可改指向，可通过 p2 改值\nconst int* const p3 = &x; \u002F\u002F 值和指向都不能改 读法技巧：从变量名开始往外读。p2 先遇到 const，说明指针本身 const；p1 指向的是 const int。",{"path":428,"category":491,"tags":492,"created":388,"draft":12,"id":493,"title":494,"titles":495,"content":496,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#左值引用和右值引用","左值引用和右值引用",[431],"普通引用 T& 是左值引用，通常绑定到有名字的对象。 int x = 10;\nint& r = x; 非常量左值引用不能绑定临时值： int& r = 10; \u002F\u002F error 但 const T& 可以绑定临时值： const int& r = 10; 右值引用写作 T&&： int&& r = 10; 它主要服务于移动语义和完美转发。机考里通常不需要手写复杂右值引用，但至少要能区分： if (a && b) { } \u002F\u002F 逻辑与\n\nint&& x = 10;  \u002F\u002F 右值引用 同样是 &&，一个在表达式里，一个在类型里。",{"path":428,"category":498,"tags":499,"created":388,"draft":12,"id":500,"title":501,"titles":502,"content":503,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#引用折叠","引用折叠",[431],"引用折叠主要在模板里出现。 template \u003Ctypename T>\nvoid f(T&& x) {\n} 这里的 T&& 在模板推导中不一定是右值引用。折叠规则： &  + &  -> &\n&  + && -> &\n&& + &  -> &\n&& + && -> && 记忆：只要有一个 &，结果就是 &；只有全是 &&，结果才是 &&。 这就是所谓 forwarding reference \u002F universal reference 的基础。现阶段先能看懂，不展开 std::forward。",{"path":428,"category":505,"tags":506,"created":388,"draft":12,"id":507,"title":508,"titles":509,"content":510,"level":23},[381,382],[384,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-2#小结","小结",[431],"指针：地址对象，核心操作是取地址和解引用。空指针：nullptr，能比较，不能解引用。野指针：未初始化、悬垂地址、生命周期结束后继续使用。数组：表达式中常退化成首元素指针，但数组本身不是指针。引用：对象别名，声明时绑定，不能改绑。引用传参：修改外部对象时比指针更顺手。const T&：避免拷贝且只读，传大对象时常用。T&&：右值引用，先认识语法和语境。引用折叠：模板转发相关，先记规则。 html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"path":512,"category":513,"tags":514,"created":388,"draft":12,"id":512,"title":516,"titles":517,"content":518,"level":16},"\u002Fposts\u002Fcpp-learning\u002Fcpp-3",[381,382],[384,515,387],"STL","C++复健笔记 Vol.3：vector 和 string",[],"复习机考里最常用的两个 STL 类型：动态数组 vector 和字符串 string。 C 语言里写数组和字符串，总要操心长度、边界和结尾的 \\0。C++ 里有 vector 和 string，很多时候会舒服不少。当然，舒服不代表不用脑子，尤其是下标、迭代器失效、输入整行字符串这些地方，还是很容易写出一些自信但错误的代码。",{"path":512,"category":520,"tags":521,"created":388,"draft":12,"id":522,"title":523,"titles":524,"content":525,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#vector动态数组","vector：动态数组",[516],"vector 可以理解成长度可变的数组。 #include \u003Ciostream>\n#include \u003Cvector>\nusing namespace std;\n\nint main() {\n    vector\u003Cint> a;\n\n    a.push_back(10);\n    a.push_back(20);\n    a.push_back(30);\n\n    cout \u003C\u003C a.size() \u003C\u003C '\\n';\n    cout \u003C\u003C a[0] \u003C\u003C ' ' \u003C\u003C a[1] \u003C\u003C ' ' \u003C\u003C a[2] \u003C\u003C '\\n';\n\n    return 0;\n} 常用操作先列一下： vector\u003Cint> a;：空 vector。vector\u003Cint> a(n);：长度为 n，元素默认初始化。vector\u003Cint> a(n, x);：长度为 n，每个元素初始化为 x。a.size()：元素个数。a.empty()：是否为空。a.push_back(x)：末尾加入元素。a.pop_back()：删除末尾元素。a.back()：最后一个元素。a.clear()：清空。 读入 n 个数时，最常见写法： int n;\ncin >> n;\n\nvector\u003Cint> a(n);\nfor (int i = 0; i \u003C n; i++) {\n    cin >> a[i];\n} 如果不知道数量，或者边读边加： vector\u003Cint> a;\nint x;\n\nwhile (cin >> x) {\n    a.push_back(x);\n}",{"path":512,"category":527,"tags":528,"created":388,"draft":12,"id":529,"title":530,"titles":531,"content":532,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#遍历-vector","遍历 vector",[516],"需要下标时，用普通 for： for (int i = 0; i \u003C (int)a.size(); i++) {\n    cout \u003C\u003C i \u003C\u003C \": \" \u003C\u003C a[i] \u003C\u003C '\\n';\n} 不需要下标时，用范围 for： for (int x : a) {\n    cout \u003C\u003C x \u003C\u003C '\\n';\n} 需要修改元素时，用引用： for (int& x : a) {\n    x *= 2;\n} 大对象只读时，用 const 引用： for (const string& s : names) {\n    cout \u003C\u003C s \u003C\u003C '\\n';\n} 这里有一个小习惯：a.size() 的类型是 size_t，是无符号整数。机考里为了少和 signed \u002F unsigned warning 纠缠，我通常会写： for (int i = 0; i \u003C (int)a.size(); i++) {\n} 或者干脆提前存下来： int n = a.size();\nfor (int i = 0; i \u003C n; i++) {\n}",{"path":512,"category":534,"tags":535,"created":388,"draft":12,"id":536,"title":537,"titles":538,"content":539,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#排序和查找","排序和查找",[516],"排序需要 \u003Calgorithm>。 #include \u003Calgorithm> 升序： sort(a.begin(), a.end()); 降序： sort(a.begin(), a.end(), greater\u003Cint>()); 自定义排序： vector\u003Cpair\u003Cint, int>> a = {{1, 3}, {1, 2}, {2, 1}};\n\nsort(a.begin(), a.end(), [](const auto& x, const auto& y) {\n    if (x.first != y.first) return x.first \u003C y.first;\n    return x.second > y.second;\n}); 这里 lambda 的意思是：先按第一维升序，第一维相同再按第二维降序。 查找某个值： auto it = find(a.begin(), a.end(), x);\n\nif (it != a.end()) {\n    cout \u003C\u003C \"found\" \u003C\u003C '\\n';\n} 如果 vector 已经有序，可以二分： bool ok = binary_search(a.begin(), a.end(), x); 找第一个大于等于 x 的位置： auto it = lower_bound(a.begin(), a.end(), x);\nint pos = it - a.begin(); 这部分后面二分专题再细写，现在先恢复 API。",{"path":512,"category":541,"tags":542,"created":388,"draft":12,"id":543,"title":544,"titles":545,"content":546,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#二维-vector","二维 vector",[516],"二维数组可以用二维 vector： int n, m;\ncin >> n >> m;\n\nvector\u003Cvector\u003Cint>> grid(n, vector\u003Cint>(m));\n\nfor (int i = 0; i \u003C n; i++) {\n    for (int j = 0; j \u003C m; j++) {\n        cin >> grid[i][j];\n    }\n} 初始化为某个值： vector\u003Cvector\u003Cint>> dist(n, vector\u003Cint>(m, -1)); 方向数组也很常见： int dx[4] = {1, -1, 0, 0};\nint dy[4] = {0, 0, 1, -1};\n\nfor (int k = 0; k \u003C 4; k++) {\n    int nx = x + dx[k];\n    int ny = y + dy[k];\n} 二维 vector 写起来方便，但每一行本质上是单独的 vector，不是一整块连续的二维数组。一般机考不太需要关心这个，知道即可。",{"path":512,"category":548,"tags":549,"created":388,"draft":12,"id":550,"title":551,"titles":552,"content":553,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#vector-的几个坑","vector 的几个坑",[516],"第一，[] 不检查越界。 vector\u003Cint> a(3);\ncout \u003C\u003C a[10] \u003C\u003C '\\n'; \u002F\u002F UB 如果想检查越界，可以用： a.at(10) 第二，空 vector 不能直接 back() 或 pop_back()。 if (!a.empty()) {\n    a.pop_back();\n} 第三，遍历时修改 vector 大小要小心。 for (int i = 0; i \u003C (int)a.size(); i++) {\n    if (a[i] == 0) {\n        a.push_back(1);\n    }\n} 这种代码可能导致循环范围不断变化。不是一定错，但要明确自己在干什么。",{"path":512,"category":555,"tags":556,"created":388,"draft":12,"id":557,"title":558,"titles":559,"content":560,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#string更好用的字符数组","string：更好用的字符数组",[516],"string 是 C++ 里的字符串类型。 #include \u003Ciostream>\n#include \u003Cstring>\nusing namespace std;\n\nint main() {\n    string s = \"hello\";\n\n    cout \u003C\u003C s.size() \u003C\u003C '\\n';\n    cout \u003C\u003C s[0] \u003C\u003C '\\n';\n\n    return 0;\n} 常用操作： s.size()：长度。s.empty()：是否为空。s[i]：第 i 个字符。s.push_back(c)：末尾加字符。s += t：拼接字符串。s.substr(pos, len)：截取子串。s.find(t)：查找子串。 例子： string s = \"abcdef\";\n\ncout \u003C\u003C s.substr(2, 3) \u003C\u003C '\\n'; \u002F\u002F cde\ncout \u003C\u003C s.find(\"cd\") \u003C\u003C '\\n';   \u002F\u002F 2 find 找不到时会返回 string::npos： if (s.find(\"xy\") == string::npos) {\n    cout \u003C\u003C \"not found\" \u003C\u003C '\\n';\n}",{"path":512,"category":562,"tags":563,"created":388,"draft":12,"id":564,"title":565,"titles":566,"content":567,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#cin-和-getline","cin 和 getline",[516],"cin >> s 会读到空白字符为止： string s;\ncin >> s; 输入： hello world 这里只会读到 hello。 如果要读整行，用 getline： string line;\ngetline(cin, line); 但如果前面刚用过 cin >> n，换行符还留在输入缓冲区里，直接 getline 可能读到空行。 int n;\ncin >> n;\n\nstring line;\ngetline(cin, line); \u002F\u002F 可能读到上一行剩下的换行 常用处理： int n;\ncin >> n;\ncin.ignore();\n\nstring line;\ngetline(cin, line); 如果要更稳一点，可以写： #include \u003Climits>\ncin.ignore(numeric_limits\u003Cstreamsize>::max(), '\\n');",{"path":512,"category":569,"tags":570,"created":388,"draft":12,"id":571,"title":572,"titles":573,"content":574,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#字符串遍历和修改","字符串遍历和修改",[516],"遍历字符： for (char c : s) {\n    cout \u003C\u003C c \u003C\u003C '\\n';\n} 修改字符： for (char& c : s) {\n    if ('a' \u003C= c && c \u003C= 'z') {\n        c = c - 'a' + 'A';\n    }\n} 也可以用 \u003Ccctype>： #include \u003Ccctype>\n\nfor (char& c : s) {\n    c = toupper(c);\n} 注意 toupper 返回的是 int，赋回 char 一般没问题，但要知道它不是直接返回 char。",{"path":512,"category":576,"tags":577,"created":388,"draft":12,"id":578,"title":579,"titles":580,"content":581,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#小练习统计单词长度","小练习：统计单词长度",[516],"写一个简单练习：读入一整行，按空格切分，输出每个单词的长度。 #include \u003Ciostream>\n#include \u003Csstream>\n#include \u003Cstring>\n#include \u003Cvector>\nusing namespace std;\n\nint main() {\n    string line;\n    getline(cin, line);\n\n    stringstream ss(line);\n    string word;\n    vector\u003Cint> lengths;\n\n    while (ss >> word) {\n        lengths.push_back(word.size());\n    }\n\n    for (int x : lengths) {\n        cout \u003C\u003C x \u003C\u003C ' ';\n    }\n    cout \u003C\u003C '\\n';\n\n    return 0;\n} 这里顺手用到了 stringstream，它可以把一个字符串当成输入流来读。以后处理“一行里有多个元素”的输入时会很方便。",{"path":512,"category":583,"tags":584,"created":388,"draft":12,"id":585,"title":508,"titles":586,"content":587,"level":23},[381,382],[384,515,387],"\u002Fposts\u002Fcpp-learning\u002Fcpp-3#小结",[516],"vector：动态数组，重点是初始化、遍历、排序、二维写法和边界。string：字符串，重点是 cin \u002F getline、子串、查找和逐字符处理。范围 for 默认拷贝，需要修改时写引用。大对象只读时用 const T&。sort、find、lower_bound 这些 API 要写熟。 下一篇继续补几个常用 STL 容器：stack、queue、deque、set、map、priority_queue。 html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"path":589,"category":590,"tags":593,"created":596,"draft":12,"id":589,"title":597,"titles":598,"content":599,"level":16},"\u002Fposts\u002Fcrossroads-at-the-end-of-2025",[591,592],"随笔","生活",[10,594,595],"Diary","2025","2025-12-31","2025年的最后一天",[],"这篇博客整理自我在 2025-12-31 发布于朋友圈的一段文案。 本文实际上传于2026年5月，主要是为了测试归档页面多年份文章列表渲染效果 感觉自己恍惚立于大型交叉路口， 是左转？右转？前行？还是掉头。 二十岁的晨光只留有三分之二了， 一旦选定便渐行渐远，再无法重走。",{"path":601,"category":381,"tags":602,"created":604,"draft":12,"id":601,"title":605,"titles":606,"content":607,"level":16},"\u002Fposts\u002Ffirst-note",[9,603],"Nuxt","2026-05-01","第一篇占位文章",[],"用来观察普通标题、无封面、少量标签时文章卡片的基础表现。 这是一篇用于前端样式调试的占位文章。它的内容刻意保持简单，方便观察文章标题、摘要、标签、字数和阅读时间在列表卡片中的排版效果。",{"path":601,"category":381,"tags":609,"created":604,"draft":12,"id":610,"title":611,"titles":612,"content":613,"level":23},[9,603],"\u002Fposts\u002Ffirst-note#小标题","小标题",[605],"这里补一点正文，让文章统计不会太空。后续可以把这篇替换成真正的博客内容。",{"path":615,"category":616,"tags":617,"created":622,"draft":12,"id":615,"title":623,"titles":624,"content":625,"level":16},"\u002Fposts\u002Flong-title-layout-test","Frontend",[618,619,620,621],"Layout","Animation","Card","Responsive","2026-05-05","一个故意写得很长很长的文章标题用来测试换行和箭头动画",[],"这篇文章用于测试长标题在首页文章列表中的换行、hover 箭头、封面图和元信息行是否会互相挤压。 长标题经常会暴露卡片布局里的问题，比如标题换行后行高太松、箭头位置不自然、摘要和标签被挤到不舒服的位置。 这篇占位文章主要用于这些视觉边界的测试。",{"path":615,"category":616,"tags":627,"created":622,"draft":12,"id":628,"title":629,"titles":630,"content":631,"level":23},[618,619,620,621],"\u002Fposts\u002Flong-title-layout-test#测试点","测试点",[623],"标题 hover 是否自然封面图比例是否稳定元信息是否尽量保持一行标签换行是否好看",{"path":633,"category":10,"tags":634,"created":636,"draft":12,"id":633,"title":637,"titles":638,"content":639,"level":16},"\u002Fposts\u002Fshort-post",[635],"Note","2026-05-15","短文",[],"测试极短标题和极短摘要。 很短的一篇占位文章。",{"path":641,"category":128,"tags":642,"created":647,"draft":12,"id":641,"title":648,"titles":649,"content":650,"level":16},"\u002Fposts\u002Ftags-overflow-demo",[130,131,643,644,645,646,621],"Tailwind","UI","Interaction","Typography","2026-05-12","标签很多的时候会发生什么",[],"这篇文章用于测试大量标签在文章卡片底部的换行、分隔符和 hover 下划线动画。 标签数量多的时候，列表卡片很容易变得拥挤。这个占位内容用来测试标签换行之后是否仍然易读，以及 hover 动画是否不会影响布局。",{"path":641,"category":128,"tags":652,"created":647,"draft":12,"id":653,"title":654,"titles":655,"content":656,"level":23},[130,131,643,644,645,646,621],"\u002Fposts\u002Ftags-overflow-demo#标签","标签",[648],"这些标签没有实际含义，只是为了撑开界面。",{"path":658,"category":128,"tags":659,"created":62,"draft":12,"id":658,"title":665,"titles":666,"content":667,"level":16},"\u002Fposts\u002Fvery-long-tags-demo",[660,661,662,663,644,664],"SuperLongFrontendExperimentTag","一个非常非常长的中文标签名字","NuxtContentRenderingPipeline","ResponsiveLayoutBoundaryCase","Hover","超长标签截断测试",[],"这篇文章专门用于测试标签名称很长时，文章卡片底部的单行截断、加号计数和展开交互。 这是一篇用于测试超长标签的占位文章。 当标签本身很长时，组件应该尽量显示能放下的内容，并把剩余标签折叠成 +N。展开后可以观察卡片固定高度下的溢出表现。",{"categories":669,"tags":686},[670,673,675,677,679,681,683],{"name":381,"count":180,"children":671},[672],{"name":382,"count":36},{"name":128,"count":36,"children":674},[],{"name":6,"count":23,"children":676},[],{"name":61,"count":16,"children":678},[],{"name":616,"count":16,"children":680},[],{"name":10,"count":16,"children":682},[],{"name":591,"count":16,"children":684},[685],{"name":592,"count":16},[687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722],{"name":384,"count":36},{"name":387,"count":36},{"name":9,"count":23},{"name":61,"count":23},{"name":130,"count":23},{"name":131,"count":23},{"name":621,"count":23},{"name":644,"count":23},{"name":595,"count":16},{"name":619,"count":16},{"name":620,"count":16},{"name":58,"count":16},{"name":365,"count":16},{"name":60,"count":16},{"name":594,"count":16},{"name":664,"count":16},{"name":366,"count":16},{"name":645,"count":16},{"name":618,"count":16},{"name":10,"count":16},{"name":132,"count":16},{"name":635,"count":16},{"name":603,"count":16},{"name":662,"count":16},{"name":663,"count":16},{"name":321,"count":16},{"name":515,"count":16},{"name":660,"count":16},{"name":133,"count":16},{"name":643,"count":16},{"name":59,"count":16},{"name":646,"count":16},{"name":367,"count":16},{"name":661,"count":16},{"name":386,"count":16},{"name":385,"count":16},{"id":724,"title":104,"body":725,"category":103,"cover":103,"created":103,"description":106,"draft":12,"extension":814,"meta":815,"navigation":816,"path":102,"pinned":12,"readingMinutes":16,"seo":817,"stem":818,"tags":103,"updated":819,"wordCount":820,"__hash__":821},"content\u002Findex.md",{"type":726,"value":727,"toc":809},"minimark",[728,732,743,750,754,762,765,773,776,798,800],[729,730,104],"h1",{"id":731},"welcome-to-nuxt-content-starter",[733,734,735,736,742],"p",{},"This is the main page displaying Markdown located at ",[737,738,724],"a",{"href":739,"rel":740},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fstarter\u002Fblob\u002Fcontent\u002Fcontent\u002Findex.md",[741],"nofollow",".",[733,744,745,746,749],{},"Move to ",[737,747,748],{"href":5},"about"," page.",[751,752,113],"h2",{"id":753},"manage-your-contents",[733,755,756,757,761],{},"Create new pages or modify the existing ones in ",[758,759,760],"code",{},"content\u002F"," directory.",[751,763,118],{"id":764},"query-render-pages",[733,766,767,768],{},"You can find an example of querying contents and rendering them in a ",[737,769,772],{"href":770,"rel":771},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fstarter\u002Fblob\u002Fcontent\u002Fapp\u002Fpages\u002F%5B...slug%5D.vue",[741],"catch-all page",[751,774,123],{"id":775},"integrate-vue-component",[777,778,780],"alert",{"color":779},"green",[733,781,782,783,787,788,793,794,797],{},"The current ",[737,784,777],{"href":785,"rel":786},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fstarter\u002Fblob\u002Fcontent\u002Fapp\u002Fcomponents\u002FAlert.vue",[741]," and the ",[737,789,792],{"href":790,"rel":791},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fstarter\u002Fblob\u002Fcontent\u002Fapp\u002Fcomponents\u002FCounter.vue",[741],"counter"," below are ",[758,795,796],{},"Vue"," components integrated into the Markdown.",[792,799],{},[733,801,802,803,808],{},"Checkout out the ",[737,804,807],{"href":805,"rel":806},"https:\u002F\u002Fcontent.nuxt.com\u002Fdocs\u002Fgetting-started",[741],"documentation"," to learn more.",{"title":159,"searchDepth":180,"depth":36,"links":810},[811,812,813],{"id":753,"depth":23,"text":113},{"id":764,"depth":23,"text":118},{"id":775,"depth":23,"text":123},"md",{},true,{"title":104,"description":106},"index","2026-05-13",97,"hKXyPlqwGb9Nd8xzA84ifq6JscFG5ftTPDAZA8K1iaM",{"categories":823,"tags":840},[824,827,829,831,833,835,837],{"name":381,"count":180,"children":825},[826],{"name":382,"count":36},{"name":128,"count":36,"children":828},[],{"name":6,"count":23,"children":830},[],{"name":61,"count":16,"children":832},[],{"name":616,"count":16,"children":834},[],{"name":10,"count":16,"children":836},[],{"name":591,"count":16,"children":838},[839],{"name":592,"count":16},[841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876],{"name":384,"count":36},{"name":387,"count":36},{"name":9,"count":23},{"name":61,"count":23},{"name":130,"count":23},{"name":131,"count":23},{"name":621,"count":23},{"name":644,"count":23},{"name":595,"count":16},{"name":619,"count":16},{"name":620,"count":16},{"name":58,"count":16},{"name":365,"count":16},{"name":60,"count":16},{"name":594,"count":16},{"name":664,"count":16},{"name":366,"count":16},{"name":645,"count":16},{"name":618,"count":16},{"name":10,"count":16},{"name":132,"count":16},{"name":635,"count":16},{"name":603,"count":16},{"name":662,"count":16},{"name":663,"count":16},{"name":321,"count":16},{"name":515,"count":16},{"name":660,"count":16},{"name":133,"count":16},{"name":643,"count":16},{"name":59,"count":16},{"name":646,"count":16},{"name":367,"count":16},{"name":661,"count":16},{"name":386,"count":16},{"name":385,"count":16},1779962792346]