mirror of
https://gitee.com/yanmu_ym/cpp.git
synced 2026-02-03 09:33:16 +08:00
3059 lines
117 KiB
HTML
3059 lines
117 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>C++标准库</title>
|
||
<link rel="stylesheet" href="style.css">
|
||
<style>
|
||
@font-face {
|
||
font-family: octicons-link;
|
||
src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
|
||
}
|
||
|
||
.markdown-body .octicon {
|
||
display: inline-block;
|
||
fill: currentColor;
|
||
vertical-align: text-bottom;
|
||
}
|
||
|
||
.markdown-body .anchor {
|
||
float: left;
|
||
line-height: 1;
|
||
margin-left: -20px;
|
||
padding-right: 4px;
|
||
}
|
||
|
||
.markdown-body .anchor:focus {
|
||
outline: none;
|
||
}
|
||
|
||
.markdown-body h1 .octicon-link,
|
||
.markdown-body h2 .octicon-link,
|
||
.markdown-body h3 .octicon-link,
|
||
.markdown-body h4 .octicon-link,
|
||
.markdown-body h5 .octicon-link,
|
||
.markdown-body h6 .octicon-link {
|
||
color: #1b1f23;
|
||
vertical-align: middle;
|
||
visibility: hidden;
|
||
}
|
||
|
||
.markdown-body h1:hover .anchor,
|
||
.markdown-body h2:hover .anchor,
|
||
.markdown-body h3:hover .anchor,
|
||
.markdown-body h4:hover .anchor,
|
||
.markdown-body h5:hover .anchor,
|
||
.markdown-body h6:hover .anchor {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.markdown-body h1:hover .anchor .octicon-link,
|
||
.markdown-body h2:hover .anchor .octicon-link,
|
||
.markdown-body h3:hover .anchor .octicon-link,
|
||
.markdown-body h4:hover .anchor .octicon-link,
|
||
.markdown-body h5:hover .anchor .octicon-link,
|
||
.markdown-body h6:hover .anchor .octicon-link {
|
||
visibility: visible;
|
||
}
|
||
|
||
.markdown-body {
|
||
-ms-text-size-adjust: 100%;
|
||
-webkit-text-size-adjust: 100%;
|
||
color: #24292e;
|
||
line-height: 1.5;
|
||
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
|
||
font-size: 16px;
|
||
line-height: 1.5;
|
||
word-wrap: break-word;
|
||
}
|
||
|
||
.markdown-body .pl-c {
|
||
color: #6a737d;
|
||
}
|
||
|
||
.markdown-body .pl-c1,
|
||
.markdown-body .pl-s .pl-v {
|
||
color: #005cc5;
|
||
}
|
||
|
||
.markdown-body .pl-e,
|
||
.markdown-body .pl-en {
|
||
color: #6f42c1;
|
||
}
|
||
|
||
.markdown-body .pl-s .pl-s1,
|
||
.markdown-body .pl-smi {
|
||
color: #24292e;
|
||
}
|
||
|
||
.markdown-body .pl-ent {
|
||
color: #22863a;
|
||
}
|
||
|
||
.markdown-body .pl-k {
|
||
color: #d73a49;
|
||
}
|
||
|
||
.markdown-body .pl-pds,
|
||
.markdown-body .pl-s,
|
||
.markdown-body .pl-s .pl-pse .pl-s1,
|
||
.markdown-body .pl-sr,
|
||
.markdown-body .pl-sr .pl-cce,
|
||
.markdown-body .pl-sr .pl-sra,
|
||
.markdown-body .pl-sr .pl-sre {
|
||
color: #032f62;
|
||
}
|
||
|
||
.markdown-body .pl-smw,
|
||
.markdown-body .pl-v {
|
||
color: #e36209;
|
||
}
|
||
|
||
.markdown-body .pl-bu {
|
||
color: #b31d28;
|
||
}
|
||
|
||
.markdown-body .pl-ii {
|
||
background-color: #b31d28;
|
||
color: #fafbfc;
|
||
}
|
||
|
||
.markdown-body .pl-c2 {
|
||
background-color: #d73a49;
|
||
color: #fafbfc;
|
||
}
|
||
|
||
.markdown-body .pl-c2:before {
|
||
content: "^M";
|
||
}
|
||
|
||
.markdown-body .pl-sr .pl-cce {
|
||
color: #22863a;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.markdown-body .pl-ml {
|
||
color: #735c0f;
|
||
}
|
||
|
||
.markdown-body .pl-mh,
|
||
.markdown-body .pl-mh .pl-en,
|
||
.markdown-body .pl-ms {
|
||
color: #005cc5;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.markdown-body .pl-mi {
|
||
color: #24292e;
|
||
font-style: italic;
|
||
}
|
||
|
||
.markdown-body .pl-mb {
|
||
color: #24292e;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.markdown-body .pl-md {
|
||
background-color: #ffeef0;
|
||
color: #b31d28;
|
||
}
|
||
|
||
.markdown-body .pl-mi1 {
|
||
background-color: #f0fff4;
|
||
color: #22863a;
|
||
}
|
||
|
||
.markdown-body .pl-mc {
|
||
background-color: #ffebda;
|
||
color: #e36209;
|
||
}
|
||
|
||
.markdown-body .pl-mi2 {
|
||
background-color: #005cc5;
|
||
color: #f6f8fa;
|
||
}
|
||
|
||
.markdown-body .pl-mdr {
|
||
color: #6f42c1;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.markdown-body .pl-ba {
|
||
color: #586069;
|
||
}
|
||
|
||
.markdown-body .pl-sg {
|
||
color: #959da5;
|
||
}
|
||
|
||
.markdown-body .pl-corl {
|
||
color: #032f62;
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.markdown-body details {
|
||
display: block;
|
||
}
|
||
|
||
.markdown-body summary {
|
||
display: list-item;
|
||
}
|
||
|
||
.markdown-body a {
|
||
background-color: transparent;
|
||
}
|
||
|
||
.markdown-body a:active,
|
||
.markdown-body a:hover {
|
||
outline-width: 0;
|
||
}
|
||
|
||
.markdown-body strong {
|
||
font-weight: inherit;
|
||
font-weight: bolder;
|
||
}
|
||
|
||
.markdown-body h1 {
|
||
font-size: 2em;
|
||
margin: .67em 0;
|
||
}
|
||
|
||
.markdown-body img {
|
||
border-style: none;
|
||
}
|
||
|
||
.markdown-body code,
|
||
.markdown-body kbd,
|
||
.markdown-body pre {
|
||
font-family: monospace,monospace;
|
||
font-size: 1em;
|
||
}
|
||
|
||
.markdown-body hr {
|
||
box-sizing: content-box;
|
||
height: 0;
|
||
overflow: visible;
|
||
}
|
||
|
||
.markdown-body input {
|
||
font: inherit;
|
||
margin: 0;
|
||
}
|
||
|
||
.markdown-body input {
|
||
overflow: visible;
|
||
}
|
||
|
||
.markdown-body [type=checkbox] {
|
||
box-sizing: border-box;
|
||
padding: 0;
|
||
}
|
||
|
||
.markdown-body * {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.markdown-body input {
|
||
font-family: inherit;
|
||
font-size: inherit;
|
||
line-height: inherit;
|
||
}
|
||
|
||
.markdown-body a {
|
||
color: #0366d6;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.markdown-body a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.markdown-body strong {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.markdown-body hr {
|
||
background: transparent;
|
||
border: 0;
|
||
border-bottom: 1px solid #dfe2e5;
|
||
height: 0;
|
||
margin: 15px 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.markdown-body hr:before {
|
||
content: "";
|
||
display: table;
|
||
}
|
||
|
||
.markdown-body hr:after {
|
||
clear: both;
|
||
content: "";
|
||
display: table;
|
||
}
|
||
|
||
.markdown-body table {
|
||
border-collapse: collapse;
|
||
border-spacing: 0;
|
||
}
|
||
|
||
.markdown-body td,
|
||
.markdown-body th {
|
||
padding: 0;
|
||
}
|
||
|
||
.markdown-body details summary {
|
||
cursor: pointer;
|
||
}
|
||
|
||
.markdown-body h1,
|
||
.markdown-body h2,
|
||
.markdown-body h3,
|
||
.markdown-body h4,
|
||
.markdown-body h5,
|
||
.markdown-body h6 {
|
||
margin-bottom: 0;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body h1 {
|
||
font-size: 32px;
|
||
}
|
||
|
||
.markdown-body h1,
|
||
.markdown-body h2 {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.markdown-body h2 {
|
||
font-size: 24px;
|
||
}
|
||
|
||
.markdown-body h3 {
|
||
font-size: 20px;
|
||
}
|
||
|
||
.markdown-body h3,
|
||
.markdown-body h4 {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.markdown-body h4 {
|
||
font-size: 16px;
|
||
}
|
||
|
||
.markdown-body h5 {
|
||
font-size: 14px;
|
||
}
|
||
|
||
.markdown-body h5,
|
||
.markdown-body h6 {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.markdown-body h6 {
|
||
font-size: 12px;
|
||
}
|
||
|
||
.markdown-body p {
|
||
margin-bottom: 10px;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body blockquote {
|
||
margin: 0;
|
||
}
|
||
|
||
.markdown-body ol,
|
||
.markdown-body ul {
|
||
margin-bottom: 0;
|
||
margin-top: 0;
|
||
padding-left: 0;
|
||
}
|
||
|
||
.markdown-body ol ol,
|
||
.markdown-body ul ol {
|
||
list-style-type: lower-roman;
|
||
}
|
||
|
||
.markdown-body ol ol ol,
|
||
.markdown-body ol ul ol,
|
||
.markdown-body ul ol ol,
|
||
.markdown-body ul ul ol {
|
||
list-style-type: lower-alpha;
|
||
}
|
||
|
||
.markdown-body dd {
|
||
margin-left: 0;
|
||
}
|
||
|
||
.markdown-body code,
|
||
.markdown-body pre {
|
||
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
|
||
font-size: 12px;
|
||
}
|
||
|
||
.markdown-body pre {
|
||
margin-bottom: 0;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body input::-webkit-inner-spin-button,
|
||
.markdown-body input::-webkit-outer-spin-button {
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
margin: 0;
|
||
}
|
||
|
||
.markdown-body .border {
|
||
border: 1px solid #e1e4e8!important;
|
||
}
|
||
|
||
.markdown-body .border-0 {
|
||
border: 0!important;
|
||
}
|
||
|
||
.markdown-body .border-bottom {
|
||
border-bottom: 1px solid #e1e4e8!important;
|
||
}
|
||
|
||
.markdown-body .rounded-1 {
|
||
border-radius: 3px!important;
|
||
}
|
||
|
||
.markdown-body .bg-white {
|
||
background-color: #fff!important;
|
||
}
|
||
|
||
.markdown-body .bg-gray-light {
|
||
background-color: #fafbfc!important;
|
||
}
|
||
|
||
.markdown-body .text-gray-light {
|
||
color: #6a737d!important;
|
||
}
|
||
|
||
.markdown-body .mb-0 {
|
||
margin-bottom: 0!important;
|
||
}
|
||
|
||
.markdown-body .my-2 {
|
||
margin-bottom: 8px!important;
|
||
margin-top: 8px!important;
|
||
}
|
||
|
||
.markdown-body .pl-0 {
|
||
padding-left: 0!important;
|
||
}
|
||
|
||
.markdown-body .py-0 {
|
||
padding-bottom: 0!important;
|
||
padding-top: 0!important;
|
||
}
|
||
|
||
.markdown-body .pl-1 {
|
||
padding-left: 4px!important;
|
||
}
|
||
|
||
.markdown-body .pl-2 {
|
||
padding-left: 8px!important;
|
||
}
|
||
|
||
.markdown-body .py-2 {
|
||
padding-bottom: 8px!important;
|
||
padding-top: 8px!important;
|
||
}
|
||
|
||
.markdown-body .pl-3,
|
||
.markdown-body .px-3 {
|
||
padding-left: 16px!important;
|
||
}
|
||
|
||
.markdown-body .px-3 {
|
||
padding-right: 16px!important;
|
||
}
|
||
|
||
.markdown-body .pl-4 {
|
||
padding-left: 24px!important;
|
||
}
|
||
|
||
.markdown-body .pl-5 {
|
||
padding-left: 32px!important;
|
||
}
|
||
|
||
.markdown-body .pl-6 {
|
||
padding-left: 40px!important;
|
||
}
|
||
|
||
.markdown-body .f6 {
|
||
font-size: 12px!important;
|
||
}
|
||
|
||
.markdown-body .lh-condensed {
|
||
line-height: 1.25!important;
|
||
}
|
||
|
||
.markdown-body .text-bold {
|
||
font-weight: 600!important;
|
||
}
|
||
|
||
.markdown-body:before {
|
||
content: "";
|
||
display: table;
|
||
}
|
||
|
||
.markdown-body:after {
|
||
clear: both;
|
||
content: "";
|
||
display: table;
|
||
}
|
||
|
||
.markdown-body>:first-child {
|
||
margin-top: 0!important;
|
||
}
|
||
|
||
.markdown-body>:last-child {
|
||
margin-bottom: 0!important;
|
||
}
|
||
|
||
.markdown-body a:not([href]) {
|
||
color: inherit;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.markdown-body blockquote,
|
||
.markdown-body dl,
|
||
.markdown-body ol,
|
||
.markdown-body p,
|
||
.markdown-body pre,
|
||
.markdown-body table,
|
||
.markdown-body ul {
|
||
margin-bottom: 16px;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body hr {
|
||
background-color: #e1e4e8;
|
||
border: 0;
|
||
height: .25em;
|
||
margin: 24px 0;
|
||
padding: 0;
|
||
}
|
||
|
||
.markdown-body blockquote {
|
||
border-left: .25em solid #dfe2e5;
|
||
color: #6a737d;
|
||
padding: 0 1em;
|
||
}
|
||
|
||
.markdown-body blockquote>:first-child {
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body blockquote>:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.markdown-body kbd {
|
||
background-color: #fafbfc;
|
||
border: 1px solid #c6cbd1;
|
||
border-bottom-color: #959da5;
|
||
border-radius: 3px;
|
||
box-shadow: inset 0 -1px 0 #959da5;
|
||
color: #444d56;
|
||
display: inline-block;
|
||
font-size: 11px;
|
||
line-height: 10px;
|
||
padding: 3px 5px;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.markdown-body h1,
|
||
.markdown-body h2,
|
||
.markdown-body h3,
|
||
.markdown-body h4,
|
||
.markdown-body h5,
|
||
.markdown-body h6 {
|
||
font-weight: 600;
|
||
line-height: 1.25;
|
||
margin-bottom: 16px;
|
||
margin-top: 24px;
|
||
}
|
||
|
||
.markdown-body h1 {
|
||
font-size: 2em;
|
||
}
|
||
|
||
.markdown-body h1,
|
||
.markdown-body h2 {
|
||
border-bottom: 1px solid #eaecef;
|
||
padding-bottom: .3em;
|
||
}
|
||
|
||
.markdown-body h2 {
|
||
font-size: 1.5em;
|
||
}
|
||
|
||
.markdown-body h3 {
|
||
font-size: 1.25em;
|
||
}
|
||
|
||
.markdown-body h4 {
|
||
font-size: 1em;
|
||
}
|
||
|
||
.markdown-body h5 {
|
||
font-size: .875em;
|
||
}
|
||
|
||
.markdown-body h6 {
|
||
color: #6a737d;
|
||
font-size: .85em;
|
||
}
|
||
|
||
.markdown-body ol,
|
||
.markdown-body ul {
|
||
padding-left: 2em;
|
||
}
|
||
|
||
.markdown-body ol ol,
|
||
.markdown-body ol ul,
|
||
.markdown-body ul ol,
|
||
.markdown-body ul ul {
|
||
margin-bottom: 0;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.markdown-body li {
|
||
word-wrap: break-all;
|
||
}
|
||
|
||
.markdown-body li>p {
|
||
margin-top: 16px;
|
||
}
|
||
|
||
.markdown-body li+li {
|
||
margin-top: .25em;
|
||
}
|
||
|
||
.markdown-body dl {
|
||
padding: 0;
|
||
}
|
||
|
||
.markdown-body dl dt {
|
||
font-size: 1em;
|
||
font-style: italic;
|
||
font-weight: 600;
|
||
margin-top: 16px;
|
||
padding: 0;
|
||
}
|
||
|
||
.markdown-body dl dd {
|
||
margin-bottom: 16px;
|
||
padding: 0 16px;
|
||
}
|
||
|
||
.markdown-body table {
|
||
display: block;
|
||
overflow: auto;
|
||
width: 100%;
|
||
}
|
||
|
||
.markdown-body table th {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.markdown-body table td,
|
||
.markdown-body table th {
|
||
border: 1px solid #dfe2e5;
|
||
padding: 6px 13px;
|
||
}
|
||
|
||
.markdown-body table tr {
|
||
background-color: #fff;
|
||
border-top: 1px solid #c6cbd1;
|
||
}
|
||
|
||
.markdown-body table tr:nth-child(2n) {
|
||
background-color: #f6f8fa;
|
||
}
|
||
|
||
.markdown-body img {
|
||
background-color: #fff;
|
||
box-sizing: content-box;
|
||
max-width: 100%;
|
||
}
|
||
|
||
.markdown-body img[align=right] {
|
||
padding-left: 20px;
|
||
}
|
||
|
||
.markdown-body img[align=left] {
|
||
padding-right: 20px;
|
||
}
|
||
|
||
.markdown-body code {
|
||
background-color: rgba(27,31,35,.05);
|
||
border-radius: 3px;
|
||
font-size: 85%;
|
||
margin: 0;
|
||
padding: .2em .4em;
|
||
}
|
||
|
||
.markdown-body pre {
|
||
word-wrap: normal;
|
||
}
|
||
|
||
.markdown-body pre>code {
|
||
background: transparent;
|
||
border: 0;
|
||
font-size: 100%;
|
||
margin: 0;
|
||
padding: 0;
|
||
white-space: pre;
|
||
word-break: normal;
|
||
}
|
||
|
||
.markdown-body .highlight {
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.markdown-body .highlight pre {
|
||
margin-bottom: 0;
|
||
word-break: normal;
|
||
}
|
||
|
||
.markdown-body .highlight pre,
|
||
.markdown-body pre {
|
||
background-color: #f6f8fa;
|
||
border-radius: 3px;
|
||
font-size: 85%;
|
||
line-height: 1.45;
|
||
overflow: auto;
|
||
padding: 16px;
|
||
}
|
||
|
||
.markdown-body pre code {
|
||
background-color: transparent;
|
||
border: 0;
|
||
display: inline;
|
||
line-height: inherit;
|
||
margin: 0;
|
||
max-width: auto;
|
||
overflow: visible;
|
||
padding: 0;
|
||
word-wrap: normal;
|
||
}
|
||
|
||
.markdown-body .commit-tease-sha {
|
||
color: #444d56;
|
||
display: inline-block;
|
||
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
|
||
font-size: 90%;
|
||
}
|
||
|
||
.markdown-body .blob-wrapper {
|
||
border-bottom-left-radius: 3px;
|
||
border-bottom-right-radius: 3px;
|
||
overflow-x: auto;
|
||
overflow-y: hidden;
|
||
}
|
||
|
||
.markdown-body .blob-wrapper-embedded {
|
||
max-height: 240px;
|
||
overflow-y: auto;
|
||
}
|
||
|
||
.markdown-body .blob-num {
|
||
-moz-user-select: none;
|
||
-ms-user-select: none;
|
||
-webkit-user-select: none;
|
||
color: rgba(27,31,35,.3);
|
||
cursor: pointer;
|
||
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
|
||
font-size: 12px;
|
||
line-height: 20px;
|
||
min-width: 50px;
|
||
padding-left: 10px;
|
||
padding-right: 10px;
|
||
text-align: right;
|
||
user-select: none;
|
||
vertical-align: top;
|
||
white-space: nowrap;
|
||
width: 1%;
|
||
}
|
||
|
||
.markdown-body .blob-num:hover {
|
||
color: rgba(27,31,35,.6);
|
||
}
|
||
|
||
.markdown-body .blob-num:before {
|
||
content: attr(data-line-number);
|
||
}
|
||
|
||
.markdown-body .blob-code {
|
||
line-height: 20px;
|
||
padding-left: 10px;
|
||
padding-right: 10px;
|
||
position: relative;
|
||
vertical-align: top;
|
||
}
|
||
|
||
.markdown-body .blob-code-inner {
|
||
color: #24292e;
|
||
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
|
||
font-size: 12px;
|
||
overflow: visible;
|
||
white-space: pre;
|
||
word-wrap: normal;
|
||
}
|
||
|
||
.markdown-body .pl-token.active,
|
||
.markdown-body .pl-token:hover {
|
||
background: #ffea7f;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.markdown-body kbd {
|
||
background-color: #fafbfc;
|
||
border: 1px solid #d1d5da;
|
||
border-bottom-color: #c6cbd1;
|
||
border-radius: 3px;
|
||
box-shadow: inset 0 -1px 0 #c6cbd1;
|
||
color: #444d56;
|
||
display: inline-block;
|
||
font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
|
||
line-height: 10px;
|
||
padding: 3px 5px;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.markdown-body :checked+.radio-label {
|
||
border-color: #0366d6;
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="1"] {
|
||
-moz-tab-size: 1;
|
||
tab-size: 1;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="2"] {
|
||
-moz-tab-size: 2;
|
||
tab-size: 2;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="3"] {
|
||
-moz-tab-size: 3;
|
||
tab-size: 3;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="4"] {
|
||
-moz-tab-size: 4;
|
||
tab-size: 4;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="5"] {
|
||
-moz-tab-size: 5;
|
||
tab-size: 5;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="6"] {
|
||
-moz-tab-size: 6;
|
||
tab-size: 6;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="7"] {
|
||
-moz-tab-size: 7;
|
||
tab-size: 7;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="8"] {
|
||
-moz-tab-size: 8;
|
||
tab-size: 8;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="9"] {
|
||
-moz-tab-size: 9;
|
||
tab-size: 9;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="10"] {
|
||
-moz-tab-size: 10;
|
||
tab-size: 10;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="11"] {
|
||
-moz-tab-size: 11;
|
||
tab-size: 11;
|
||
}
|
||
|
||
.markdown-body .tab-size[data-tab-size="12"] {
|
||
-moz-tab-size: 12;
|
||
tab-size: 12;
|
||
}
|
||
|
||
.markdown-body .task-list-item {
|
||
list-style-type: none;
|
||
}
|
||
|
||
.markdown-body .task-list-item+.task-list-item {
|
||
margin-top: 3px;
|
||
}
|
||
|
||
.markdown-body .task-list-item input {
|
||
margin: 0 .2em .25em -1.6em;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.markdown-body hr {
|
||
border-bottom-color: #eee;
|
||
}
|
||
|
||
.markdown-body .pl-0 {
|
||
padding-left: 0!important;
|
||
}
|
||
|
||
.markdown-body .pl-1 {
|
||
padding-left: 4px!important;
|
||
}
|
||
|
||
.markdown-body .pl-2 {
|
||
padding-left: 8px!important;
|
||
}
|
||
|
||
.markdown-body .pl-3 {
|
||
padding-left: 16px!important;
|
||
}
|
||
|
||
.markdown-body .pl-4 {
|
||
padding-left: 24px!important;
|
||
}
|
||
|
||
.markdown-body .pl-5 {
|
||
padding-left: 32px!important;
|
||
}
|
||
|
||
.markdown-body .pl-6 {
|
||
padding-left: 40px!important;
|
||
}
|
||
|
||
.markdown-body .pl-7 {
|
||
padding-left: 48px!important;
|
||
}
|
||
|
||
.markdown-body .pl-8 {
|
||
padding-left: 64px!important;
|
||
}
|
||
|
||
.markdown-body .pl-9 {
|
||
padding-left: 80px!important;
|
||
}
|
||
|
||
.markdown-body .pl-10 {
|
||
padding-left: 96px!important;
|
||
}
|
||
|
||
.markdown-body .pl-11 {
|
||
padding-left: 112px!important;
|
||
}
|
||
|
||
.markdown-body .pl-12 {
|
||
padding-left: 128px!important;
|
||
}
|
||
|
||
/*# sourceURL=webpack://./node_modules/github-markdown-css/github-markdown.css */
|
||
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9naXRodWItbWFya2Rvd24tY3NzL2dpdGh1Yi1tYXJrZG93bi5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSwwQkFBMEI7RUFDMUIsMkRBQXF0RTtBQUN2dEU7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsa0JBQWtCO0VBQ2xCLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTs7Ozs7O0VBTUUsY0FBYztFQUNkLHNCQUFzQjtFQUN0QixrQkFBa0I7QUFDcEI7O0FBRUE7Ozs7OztFQU1FLHFCQUFxQjtBQUN2Qjs7QUFFQTs7Ozs7O0VBTUUsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsMEJBQTBCO0VBQzFCLDhCQUE4QjtFQUM5QixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLGtJQUFrSTtFQUNsSSxlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUUsY0FBYztBQUNoQjs7QUFFQTs7RUFFRSxjQUFjO0FBQ2hCOztBQUVBOztFQUVFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTs7Ozs7OztFQU9FLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUUsY0FBYztBQUNoQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsY0FBYztBQUNoQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7OztFQUdFLGNBQWM7RUFDZCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFD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 */
|
||
</style>
|
||
<style>
|
||
/**
|
||
* prism.js default theme for JavaScript, CSS and HTML
|
||
* Based on dabblet (http://dabblet.com)
|
||
* @author Lea Verou
|
||
*/
|
||
|
||
code[class*="language-"],
|
||
pre[class*="language-"] {
|
||
color: black;
|
||
background: none;
|
||
text-shadow: 0 1px white;
|
||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||
font-size: 1em;
|
||
text-align: left;
|
||
white-space: pre;
|
||
word-spacing: normal;
|
||
word-break: normal;
|
||
word-wrap: normal;
|
||
line-height: 1.5;
|
||
|
||
-moz-tab-size: 4;
|
||
-o-tab-size: 4;
|
||
tab-size: 4;
|
||
|
||
-webkit-hyphens: none;
|
||
-moz-hyphens: none;
|
||
-ms-hyphens: none;
|
||
hyphens: none;
|
||
}
|
||
|
||
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
|
||
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
|
||
text-shadow: none;
|
||
background: #b3d4fc;
|
||
}
|
||
|
||
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
|
||
code[class*="language-"]::selection, code[class*="language-"] ::selection {
|
||
text-shadow: none;
|
||
background: #b3d4fc;
|
||
}
|
||
|
||
@media print {
|
||
code[class*="language-"],
|
||
pre[class*="language-"] {
|
||
text-shadow: none;
|
||
}
|
||
}
|
||
|
||
/* Code blocks */
|
||
pre[class*="language-"] {
|
||
padding: 1em;
|
||
margin: .5em 0;
|
||
overflow: auto;
|
||
}
|
||
|
||
:not(pre) > code[class*="language-"],
|
||
pre[class*="language-"] {
|
||
background: #f5f2f0;
|
||
}
|
||
|
||
/* Inline code */
|
||
:not(pre) > code[class*="language-"] {
|
||
padding: .1em;
|
||
border-radius: .3em;
|
||
white-space: normal;
|
||
}
|
||
|
||
.token.comment,
|
||
.token.prolog,
|
||
.token.doctype,
|
||
.token.cdata {
|
||
color: slategray;
|
||
}
|
||
|
||
.token.punctuation {
|
||
color: #999;
|
||
}
|
||
|
||
.token.namespace {
|
||
opacity: .7;
|
||
}
|
||
|
||
.token.property,
|
||
.token.tag,
|
||
.token.boolean,
|
||
.token.number,
|
||
.token.constant,
|
||
.token.symbol,
|
||
.token.deleted {
|
||
color: #905;
|
||
}
|
||
|
||
.token.selector,
|
||
.token.attr-name,
|
||
.token.string,
|
||
.token.char,
|
||
.token.builtin,
|
||
.token.inserted {
|
||
color: #690;
|
||
}
|
||
|
||
.token.operator,
|
||
.token.entity,
|
||
.token.url,
|
||
.language-css .token.string,
|
||
.style .token.string {
|
||
color: #9a6e3a;
|
||
/* This background color was intended by the author of this theme. */
|
||
background: hsla(0, 0%, 100%, .5);
|
||
}
|
||
|
||
.token.atrule,
|
||
.token.attr-value,
|
||
.token.keyword {
|
||
color: #07a;
|
||
}
|
||
|
||
.token.function,
|
||
.token.class-name {
|
||
color: #DD4A68;
|
||
}
|
||
|
||
.token.regex,
|
||
.token.important,
|
||
.token.variable {
|
||
color: #e90;
|
||
}
|
||
|
||
.token.important,
|
||
.token.bold {
|
||
font-weight: bold;
|
||
}
|
||
.token.italic {
|
||
font-style: italic;
|
||
}
|
||
|
||
.token.entity {
|
||
cursor: help;
|
||
}
|
||
|
||
/*# sourceURL=webpack://./node_modules/prismjs/themes/prism.css */
|
||
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9wcmlzbWpzL3RoZW1lcy9wcmlzbS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7RUFJRTs7QUFFRjs7Q0FFQyxZQUFZO0NBQ1osZ0JBQWdCO0NBQ2hCLHdCQUF3QjtDQUN4QixzRUFBc0U7Q0FDdEUsY0FBYztDQUNkLGdCQUFnQjtDQUNoQixnQkFBZ0I7Q0FDaEIsb0JBQW9CO0NBQ3BCLGtCQUFrQjtDQUNsQixpQkFBaUI7Q0FDakIsZ0JBQWdCOztDQUVoQixnQkFBZ0I7Q0FDaEIsY0FBYztDQUNkLFdBQVc7O0NBRVgscUJBQXFCO0NBQ3JCLGtCQUFrQjtDQUNsQixpQkFBaUI7Q0FDakIsYUFBYTtBQUNkOztBQUVBOztDQUVDLGlCQUFpQjtDQUNqQixtQkFBbUI7QUFDcEI7O0FBRUE7O0NBRUMsaUJBQWlCO0NBQ2pCLG1CQUFtQjtBQUNwQjs7QUFFQTtDQUNDOztFQUVDLGlCQUFpQjtDQUNsQjtBQUNEOztBQUVBLGdCQUFnQjtBQUNoQjtDQUNDLFlBQVk7Q0FDWixjQUFjO0NBQ2QsY0FBYztBQUNmOztBQUVBOztDQUVDLG1CQUFtQjtBQUNwQjs7QUFFQSxnQkFBZ0I7QUFDaEI7Q0FDQyxhQUFhO0NBQ2IsbUJBQW1CO0NBQ25CLG1CQUFtQjtBQUNwQjs7QUFFQTs7OztDQUlDLGdCQUFnQjtBQUNqQjs7QUFFQTtDQUNDLFdBQVc7QUFDWjs7QUFFQTtDQUNDLFdBQVc7QUFDWjs7QUFFQTs7Ozs7OztDQU9DLFdBQVc7QUFDWjs7QUFFQTs7Ozs7O0NBTUMsV0FBVztBQUNaOztBQUVBOzs7OztDQUtDLGNBQWM7Q0FDZCxvRUFBb0U7Q0FDcEUsaUNBQWlDO0FBQ2xDOztBQUVBOzs7Q0FHQyxXQUFXO0FBQ1o7O0FBRUE7O0NBRUMsY0FBYztBQUNmOztBQUVBOzs7Q0FHQyxXQUFXO0FBQ1o7O0FBRUE7O0NBRUMsaUJBQWlCO0FBQ2xCO0FBQ0E7Q0FDQyxrQkFBa0I7QUFDbkI7O0FBRUE7Q0FDQyxZQUFZO0FBQ2IiLCJzb3VyY2VSb290IjoiIn0= */
|
||
</style>
|
||
<style>
|
||
|
||
</style>
|
||
<style>
|
||
.markdown-body {
|
||
font-family: -apple-system,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
|
||
box-sizing: border-box;
|
||
min-width: 200px;
|
||
max-width: 980px;
|
||
margin: 0 auto;
|
||
padding: 45px;
|
||
}
|
||
|
||
@media not print {
|
||
.markdown-body {
|
||
padding: 45px;
|
||
}
|
||
|
||
@media (max-width: 767px) {
|
||
.markdown-body {
|
||
padding: 15px;
|
||
}
|
||
}
|
||
}
|
||
|
||
.hf-container {
|
||
color: #24292e;
|
||
line-height: 1.3;
|
||
}
|
||
|
||
.markdown-body .highlight pre,
|
||
.markdown-body pre {
|
||
white-space: pre-wrap;
|
||
}
|
||
.markdown-body table {
|
||
display: table;
|
||
}
|
||
.markdown-body img[data-align="center"] {
|
||
display: block;
|
||
margin: 0 auto;
|
||
}
|
||
.markdown-body img[data-align="right"] {
|
||
display: block;
|
||
margin: 0 0 0 auto;
|
||
}
|
||
.markdown-body li.task-list-item {
|
||
list-style-type: none;
|
||
}
|
||
.markdown-body li > [type=checkbox] {
|
||
margin: 0 0 0 -1.3em;
|
||
}
|
||
.markdown-body input[type="checkbox"] ~ p {
|
||
margin-top: 0;
|
||
display: inline-block;
|
||
}
|
||
.markdown-body ol ol,
|
||
.markdown-body ul ol {
|
||
list-style-type: decimal;
|
||
}
|
||
.markdown-body ol ol ol,
|
||
.markdown-body ol ul ol,
|
||
.markdown-body ul ol ol,
|
||
.markdown-body ul ul ol {
|
||
list-style-type: decimal;
|
||
}
|
||
</style>
|
||
<style>.markdown-body a.footnote-ref {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.footnotes {
|
||
font-size: .85em;
|
||
opacity: .8;
|
||
}
|
||
|
||
.footnotes li[role="doc-endnote"] {
|
||
position: relative;
|
||
}
|
||
|
||
.footnotes .footnote-back {
|
||
position: absolute;
|
||
font-family: initial;
|
||
top: .2em;
|
||
right: 1em;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.inline-math.invalid,
|
||
.multiple-math.invalid {
|
||
color: rgb(255, 105, 105);
|
||
}
|
||
|
||
.toc-container {
|
||
width: 100%;
|
||
}
|
||
|
||
.toc-container .toc-title {
|
||
font-weight: 700;
|
||
font-size: 1.2em;
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.toc-container li,
|
||
.toc-container ul,
|
||
.toc-container ul li {
|
||
list-style: none !important;
|
||
}
|
||
|
||
.toc-container > ul {
|
||
padding-left: 0;
|
||
}
|
||
|
||
.toc-container ul li span {
|
||
display : flex;
|
||
}
|
||
|
||
.toc-container ul li span a {
|
||
color: inherit;
|
||
text-decoration: none;
|
||
}
|
||
.toc-container ul li span a:hover {
|
||
color: inherit;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.toc-container ul li span span.dots {
|
||
flex: 1;
|
||
height: 0.65em;
|
||
margin: 0 10px;
|
||
border-bottom: 2px dotted black;
|
||
}
|
||
|
||
/*# sourceURL=webpack://./src/muya/lib/assets/styles/exportStyle.css */
|
||
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy9tdXlhL2xpYi9hc3NldHMvc3R5bGVzL2V4cG9ydFN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsb0JBQW9CO0VBQ3BCLFNBQVM7RUFDVCxVQUFVO0VBQ1YscUJBQXFCO0FBQ3ZCOztBQUVBOztFQUVFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0FBQ2xCOztBQUVBOzs7RUFHRSwyQkFBMkI7QUFDN0I7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxPQUFPO0VBQ1AsY0FBYztFQUNkLGNBQWM7RUFDZCwrQkFBK0I7QUFDakMiLCJzb3VyY2VSb290IjoiIn0= */</style>
|
||
<style>.markdown-body{}pre.front-matter{display:none!important;}</style>
|
||
</head>
|
||
<body>
|
||
<article class="markdown-body"><div class="toc-container"><p class="toc-title">目录</p><ul class="toc-list"><li><span><a class="toc-h1" href="#c标准库是什么?">C++标准库是什么?</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#环境准备">环境准备</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#visual-studio">Visual Studio</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#gccmingw">GCC(MinGW)</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#学习参考">学习参考</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#c语言库">C语言库</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#字符串">字符串</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#basic_string与string">basic_string与string</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#构造">构造</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#元素访问">元素访问</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#容量">容量</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#迭代器">迭代器</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#插入">插入</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#删除">删除</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#检测与比较">检测与比较</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#替换与子串">替换与子串</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#查找">查找</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#其他操作">其他操作</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#string_view">string_view</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#容器">容器</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#array">array</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#基本操作">基本操作</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#迭代器-1">迭代器</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#vector">vector</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#构造-1">构造</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#就地构造">就地构造</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#forward_list">forward_list</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#迭代器示意图">迭代器示意图</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sort---andand---reverse">sort && reverse</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#merge----andand---splice_after">merge && splice_after</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#unique---andand---remove----andand---remove_if">unique && remove && remove_if</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#list">list</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#"></a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#stack">stack</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#queue">queue</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#deque">deque</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#priority_queue">priority_queue</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#set">set</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#multiset">multiset</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#unordered_set">unordered_set</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#unordered_multiset">unordered_multiset</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#map">map</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#multimap">multimap</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#unordered_map">unordered_map</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#unordered_multimap">unordered_multimap</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#span与容器">span与容器</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#算法">算法</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#迭代器-2">迭代器</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#数值操作">数值操作</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#-1"></a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#随机数">随机数</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#位操作">位操作</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#时间日期">时间日期</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#文件系统(filesystem)">文件系统(filesystem)</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#正则表达式">正则表达式</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#regex_match">regex_match</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#regex_search">regex_search</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#regex_replace">regex_replace</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#多线程">多线程</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#mutex">mutex</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#lock_guard">lock_guard</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#-2"></a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#condition_variable">condition_variable</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#async">async</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#promise-future">promise future</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#原子操作">原子操作</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#通用工具库">通用工具库</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#语言支持库">语言支持库</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#三路比较">三路比较</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#其他">其他</a><span class="dots"></span></span></li></ul></div><h1 class="atx" id="c标准库是什么?">C++标准库是什么?</h1>
|
||
<p>C++标准库是一系列类和函数的集合,属于C++标准的一部分,只要支持C++标准的环境中就可以直接使用。内容丰富,功能强大。对初学者来说也是很好的提升C++技能的学习材料。</p>
|
||
<p>C++标准库主要包括C++库和C语言库,头文件如下图所示。</p>
|
||
<p>C++标准库都定义在命名空间std中。</p>
|
||
<p><img alt="headers_for_std_lib" src="./img/headers_for_std_lib.png"></p>
|
||
<blockquote>
|
||
<p>本课程的目的是带领大家了解一下C++标准库,因此讲解不会太深入,只是大致过一遍让大家知道有这么个东西。上面图片中的内容也不会全部涉及,如有需要的可以自行深入研究。</p>
|
||
</blockquote>
|
||
<p> </p>
|
||
<h1 class="atx" id="环境准备">环境准备</h1>
|
||
<p>安装的环境要能支持C++20以上的版本。能支持C++23最好。<mark>如果某个类或方法编译报错,则需要检查一下是哪个版本的C++才支持的,看看当前使用的版本是否支持</mark></p>
|
||
<h2 class="atx" id="visual-studio">Visual Studio</h2>
|
||
<p>安装器下载地址:<a href="https://visualstudio.microsoft.com/zh-hans/downloads/">https://visualstudio.microsoft.com/zh-hans/downloads/</a></p>
|
||
<p>下载Community 版本的,不需要激活码。</p>
|
||
<p>以Microsoft Visual Studio Community 2022 为例,新建项目之后,在项目 **属性(Properties)-->通用(General)-->C++语言标准(C++ Language Standard)**选择Preview版本即可支持C++23的特性。</p>
|
||
<p><img alt="Visual Studio C++标准设置" src="./img/vs_cpp_std.png"></p>
|
||
<p> </p>
|
||
<h2 class="atx" id="gccmingw">GCC(MinGW)</h2>
|
||
<p>MinGW推荐以下两个版本,选择其中一个即可。<strong>w64devkit提供的工具更多,操作更接近Linux。</strong></p>
|
||
<p>w64devkit:<a href="https://github.com/skeeto/w64devkit/releases">https://github.com/skeeto/w64devkit/releases</a></p>
|
||
<p>mingw-builds:<a href="https://github.com/niXman/mingw-builds-binaries/releases">https://github.com/niXman/mingw-builds-binaries/releases</a></p>
|
||
<p>在编译时,使用**-std=...**指定需要使用的C++版本,例如:</p>
|
||
<pre><code class="fenced-code-block language-c++">g++ -o <outputname> <sourcefile.cpp> -std=c++20</code></pre>
|
||
<p>可使用的C++标准有:c++98 c++11 c++14 c++17 c++20 c++23</p>
|
||
<p> </p>
|
||
<h2 class="atx" id="学习参考">学习参考</h2>
|
||
<p>cppreference中文版:<a href="https://zh.cppreference.com/">https://zh.cppreference.com/</a></p>
|
||
<p>cppreference英文版:<a href="https://en.cppreference.com/">https://en.cppreference.com/</a></p>
|
||
<p>cplusplus:<a href="https://cplusplus.com/">https://cplusplus.com/</a></p>
|
||
<p>learncpp:<a href="https://www.learncpp.com/">https://www.learncpp.com/</a></p>
|
||
<p>hackingcpp:<a href="https://hackingcpp.com/">https://hackingcpp.com/</a></p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="c语言库">C语言库</h1>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th align="center">C++头文件</th>
|
||
<th align="center">C语言头文件</th>
|
||
<th align="center">内容</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstdio.html">cstdio</a></td>
|
||
<td align="center"><a href="./cppref/zh/zh/c/io.html">stdio.h</a></td>
|
||
<td align="center">提供通用文件操作并提供有字符输入/输出能力的函数。</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cmath.html">cmath</a></td>
|
||
<td align="center"><a href="./cppref/zh/zh/c/numeric/math.html">math.h</a></td>
|
||
<td align="center">常用数学函数</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstring.html">cstring</a></td>
|
||
<td align="center"><a href="./cppref/zh/zh/c/string/byte.html">string.h</a></td>
|
||
<td align="center">字符串处理函数和一些内存操作函数</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstdlib.html">cstdlib</a></td>
|
||
<td align="center"><a href="./cppref/zh/zh/c/header.html">stdlib.h</a></td>
|
||
<td align="center">基础工具库:<a href="cppref/zh/zh/c/memory.html">动态内存管理</a>、<a href="cppref/zh/zh/c/program.html">程序支持工具</a>、<a href="cppref/zh/zh/c/numeric/random.html">随机数</a>、<a href="cppref/zh/zh/c/algorithm.html">算法</a>、<a href="cppref/zh/zh/c/string/byte.html">字符与数字转换</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cctype.html">cctype</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/string/byte.html">ctype.h</a></td>
|
||
<td align="center">字符分类与大小写转换函数库</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cinttypes.html">cinttypes</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/types/integer.html">inttypes.h</a></td>
|
||
<td align="center">整数类型格式宏常量</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/clocale.html">clocale</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/locale.html">locale.h</a></td>
|
||
<td align="center">本地化工具库</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstdarg.html">cstdarg</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/variadic.html">stdarg.h</a></td>
|
||
<td align="center">变参数函数工具库</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstdint.html">cstdint</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/types/integer.html">stdint.h</a></td>
|
||
<td align="center">定宽整数类型及宏常量定义</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/ctime.html">ctime</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/chrono.html">time.h</a></td>
|
||
<td align="center">时间和日期工具</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cassert.html">cassert</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/error.html">assert.h</a></td>
|
||
<td align="center">断言工具库</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cerrno.html">cerrno</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/error.html">errno.h</a></td>
|
||
<td align="center">错误号定义与错误处理</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cfenv.html">cfenv</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/numeric/fenv.html">fenv.h</a></td>
|
||
<td align="center">浮点环境函数与宏</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cfloat.html">cfloat</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/types/limits.html">float.h</a></td>
|
||
<td align="center">浮点类型极限宏定义</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/climits.html">climits</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/types/limits.html">limits.h</a></td>
|
||
<td align="center">整数类型一些宏定义</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/csetjmp.html">csetjmp</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/program.html">setjmp.h</a></td>
|
||
<td align="center">非局部跳转</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/csignal.html">csignal</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/program.html">signal.h</a></td>
|
||
<td align="center">几个为信号管理的函数和常量宏</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cstddef.html">cstddef</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/types.html">stddef.h</a></td>
|
||
<td align="center">附加基本类型及便利宏</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cuchar.html">cuchar</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/string/multibyte.html">uchar.h</a></td>
|
||
<td align="center">UTF-16 和 UTF-32 字符工具</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cwchar.html">cwchar</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/string/wide.html">wchar.h</a></td>
|
||
<td align="center">扩展多字节和宽字符工具</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><a href="cppref/zh/zh/cpp/header/cwctype.html">cwctype</a></td>
|
||
<td align="center"><a href="cppref/zh/zh/c/string/wide.html">wctype.h</a></td>
|
||
<td align="center">用来确定包含于宽字符数据中的类型的函数</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="字符串">字符串</h1>
|
||
<h2 class="atx" id="basic_string与string">basic_string与string</h2>
|
||
<p>C++当中基本数据类型没有字符串,需要处理字符串时用的是字符数组,操作起来相当不方便,因此在C++标准库中提供了一个字符串类<code>std::string</code>,将字符串的一些基本操作封装到类中,简化了字符串的操作。</p>
|
||
<p>string类的定义如下:</p>
|
||
<pre><code class="fenced-code-block language-c++">typedef basic_string<char> string;</code></pre>
|
||
<p>可以看到,string类由模板类basic_string类型为char时定义而来,因此要学习string有哪些操作,需要学习basic_string。</p>
|
||
<p> </p>
|
||
<p><strong><a href="cppref/zh/zh/cpp/string/basic_string.html">basic_string文档</a></strong></p>
|
||
<p> </p>
|
||
<h3 class="atx" id="构造">构造</h3>
|
||
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
|
||
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span>
|
||
|
||
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token comment">// 用char*赋值构造</span>
|
||
string str1 <span class="token operator">=</span> <span class="token string">"北国风光,千里冰封,万里雪飘"</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str1 = "</span> <span class="token operator"><<</span> str1 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
string <span class="token function">str2</span><span class="token punctuation">(</span><span class="token string">"望长城内外,惟馀莽莽"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str2 = "</span> <span class="token operator"><<</span> str2 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 无参构造,构造一个空字符串,构造之后可以通过 = 进行赋值</span>
|
||
string str3<span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str3 = "</span> <span class="token operator"><<</span> str3 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 用指定字符重复指定次数填充构造</span>
|
||
string <span class="token function">str4</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token char">'H'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str4 = "</span> <span class="token operator"><<</span> str4 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 拷贝构造</span>
|
||
string <span class="token function">str5</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str5 = "</span> <span class="token operator"><<</span> str5 <span class="token operator"><<</span> <span class="token string">"\t\t"</span> <span class="token operator"><<</span> <span class="token string">"str2 = "</span> <span class="token operator"><<</span> str2 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 移动构造</span>
|
||
string <span class="token function">str6</span><span class="token punctuation">(</span><span class="token function">move</span><span class="token punctuation">(</span>str5<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str6 = "</span> <span class="token operator"><<</span> str6 <span class="token operator"><<</span> <span class="token string">"\t\t"</span> <span class="token operator"><<</span> <span class="token string">"str5 = "</span> <span class="token operator"><<</span> str5 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 指定字符范围进行构造</span>
|
||
string <span class="token function">str7</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
string <span class="token function">str8</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str7 = "</span> <span class="token operator"><<</span> str7 <span class="token operator"><<</span> endl <span class="token operator"><<</span> <span class="token string">"str8 = "</span> <span class="token operator"><<</span> str8 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// assign</span>
|
||
string str9 <span class="token operator">=</span> <span class="token string">"大河上下"</span><span class="token punctuation">;</span>
|
||
str9<span class="token punctuation">.</span><span class="token function">assign</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str9 = "</span> <span class="token operator"><<</span> str9 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 字符串拼接</span>
|
||
string str10 <span class="token operator">=</span> str1 <span class="token operator">+</span> str2<span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str10 = "</span> <span class="token operator"><<</span> str10 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
str10 <span class="token operator">+=</span> <span class="token string">"只识弯弓射大雕"</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> <span class="token string">"str10 += "</span> <span class="token operator"><<</span> str10 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span></code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="元素访问">元素访问</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str1 = "Hello World";
|
||
string str2 = "人生易老天难老,岁岁重阳";
|
||
// at与[]
|
||
string str10 = "Hello World kkkkddd";
|
||
cout << "[] " << str1[10] << endl;
|
||
cout << "at " << str1.at(3) << endl;
|
||
str1.at(3) = 'K';
|
||
str1[10] = 'a';
|
||
cout << "str1 = " << str1 << endl;
|
||
|
||
// front back
|
||
cout << "front() = " << str1.front() << endl;
|
||
cout << "back() = " << str1.back() << endl;
|
||
|
||
// c_str data
|
||
cout << "c_str() = " << str1.c_str() << endl;
|
||
cout << "data() = " << str1.data() << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="容量">容量</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str1 = "漫天皆白,雪里行军情更迫";
|
||
string str2 = "Hello Worldddddd";
|
||
string str3;
|
||
|
||
// empty
|
||
cout << str1.empty() << endl;
|
||
cout << str3.empty() << endl;
|
||
|
||
// size length
|
||
cout << "str1.size() = " << str1.size() << "\tstr1.length() = " << str1.length() << endl;
|
||
cout << "str2.size() = " << str2.size() << "\tstr2.length() = " << str2.length() << endl;
|
||
cout << "str3.size() = " << str3.size() << "\tstr3.length() = " << str3.length() << endl;
|
||
|
||
// max_size
|
||
cout << "str1.max_size() = " << str1.max_size() << endl;
|
||
cout << "str2.max_size() = " << str2.max_size() << endl;
|
||
cout << "str3.max_size() = " << str3.max_size() << endl;
|
||
|
||
// capacity
|
||
cout << "str1.capacity() = " << str1.capacity() << endl;
|
||
cout << "str2.capacity() = " << str2.capacity() << endl;
|
||
cout << "str3.capacity() = " << str3.capacity() << endl;
|
||
|
||
// reserve
|
||
str2.reserve(100);
|
||
cout << "str2.size() = " << str2.size() << "\t\t" << "str2.capacity() = " << str2.capacity() << endl;
|
||
str2.reserve(10);
|
||
cout << "str2.size() = " << str2.size() << "\t\t" << "str2.capacity() = " << str2.capacity() << endl;
|
||
|
||
// shrink_to_fit
|
||
str2.shrink_to_fit();
|
||
cout << "str2.size() = " << str2.size() << "\t\t" << "str2.capacity() = " << str2.capacity() << endl;
|
||
|
||
// resize
|
||
str2.resize(120);
|
||
cout << "str2.size() = " << str2.size() << "\t\t" << "str2.capacity() = " << str2.capacity() << endl;
|
||
str2.resize(10);
|
||
cout << "str2.size() = " << str2.size() << "\t\t" << "str2.capacity() = " << str2.capacity() << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="迭代器">迭代器</h3>
|
||
<p>迭代器是一种遍历接口,一般是为容器类(如链表、队列等。string类也是一种容器)提供统一的遍历接口,使用人员无需关心容器内存分配与管理细节。</p>
|
||
<p>C++标准库中容器的迭代器分为四种:<strong>普通迭代器(简称迭代器) iterator</strong>、<strong>只读迭代器 const_iterator</strong>、<strong>反向迭代器 reverse_iterator</strong>、<strong>反向只读迭代器 const_reverse_iterator</strong>。</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "Hello World";
|
||
|
||
// 普通迭代器, 可用来读写
|
||
string::iterator iter = str.begin();
|
||
// auto iter = str.begin();
|
||
for(; iter != str.end(); iter++)
|
||
{
|
||
cout << *iter << "\t";
|
||
*iter = 'A' + (iter - str.begin());
|
||
}
|
||
cout << endl << str << endl;
|
||
|
||
// 只读迭代器
|
||
string::const_iterator citer = str.cbegin();
|
||
for(; citer != str.cend(); citer++)
|
||
{
|
||
cout << *citer << "\t";
|
||
}
|
||
cout << endl;
|
||
|
||
// 反向迭代器
|
||
string::reverse_iterator riter = str.rbegin();
|
||
for(; riter != str.rend(); riter++)
|
||
{
|
||
cout << *riter << "\t";
|
||
*riter = 'B' + (riter - str.rbegin());
|
||
}
|
||
cout << endl << str << endl;
|
||
|
||
// 反向只读迭代器
|
||
string::const_reverse_iterator criter = str.crbegin();
|
||
for(; criter != str.crend(); criter ++)
|
||
{
|
||
cout << *criter << "\t";
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="插入">插入</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "Hello World";
|
||
string str2 = "STRING2";
|
||
|
||
// 在指定位置开始重复插入指定次数的单个字符
|
||
str.insert(2, 5, 'A');
|
||
cout << str << endl;
|
||
|
||
// 在指定位置开始插入字符串
|
||
str.insert(5, "This is A New Insert");
|
||
cout << str << endl;
|
||
|
||
// 在指定位置插入另一个string
|
||
str.insert(10, str2);
|
||
cout << str << endl;
|
||
|
||
// 在指定位置插入另一个string指定范围内的内容(起始位置,字符数)
|
||
str.insert(0, str2, 2, 2);
|
||
cout << str << endl;
|
||
|
||
// 在结尾处插入一个字符
|
||
str.push_back('R');
|
||
cout << str << endl;
|
||
|
||
// 在结尾处追加:可以是单个字符、字符串、string,可以指定追加范围和追加字符数量
|
||
str.append("What to do?");
|
||
cout << str << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="删除">删除</h3>
|
||
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
|
||
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span>
|
||
|
||
using namespace std<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
string str <span class="token operator">=</span> <span class="token string">"Hello World"</span><span class="token punctuation">;</span>
|
||
string str2 <span class="token operator">=</span> <span class="token string">"STRING2"</span><span class="token punctuation">;</span>
|
||
|
||
|
||
<span class="token comment">// 清除全部内容</span>
|
||
str2<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> str2 <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 删除最后一个字符</span>
|
||
str<span class="token punctuation">.</span><span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> str <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 删除指定索引与数量的字符</span>
|
||
str<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> str <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 删除指定迭代器范围内的字符</span>
|
||
str<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>str<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> str<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
cout <span class="token operator"><<</span> str <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span></code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="检测与比较">检测与比较</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "Hello World";
|
||
string str2 = "STRING2";
|
||
|
||
// 是否以指定字符开头 可以是单个字符
|
||
cout << str.starts_with("He") << endl;
|
||
|
||
// 检测是否以指定字符串结尾 可以是单个字符
|
||
cout << str.ends_with(".jpg") << endl;
|
||
|
||
// 检测是否包含指定字符串 可以是单个字符
|
||
cout << str.contains("llo") << endl;
|
||
|
||
// 以字典序与另一个string相比,如果小于另一个返回负数,大于返回正数,内容相同返回0
|
||
cout << str.compare(str2) << endl;
|
||
|
||
// 以字典序比较两个string,内容相同返回true,否则返回false
|
||
bool cmp_result = str == str2;
|
||
cout << cmp_result << endl;
|
||
|
||
// 三路比较,返回strong_odering
|
||
strong_ordering order = str <=> str2;
|
||
// 再将order与0相比,如果order > 0, 则str > str2(字典序)
|
||
// 如果order < 0, 则 str < str2
|
||
// 如果order == 0, 则 str == str2
|
||
bool gt = order > 0;
|
||
bool lt = order < 0;
|
||
bool eq = order == 0;
|
||
cout << "gt = " << gt << endl;
|
||
cout << "lt = " << lt << endl;
|
||
cout << "eq = " << eq << endl;
|
||
// 或者用is_gt is_lt is_eq判断
|
||
cout << "is_gt " << is_gt(order) << endl;
|
||
cout << "is_lt " << is_lt(order) << endl;
|
||
cout << "is_eq " << is_eq(order) << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="替换与子串">替换与子串</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "Hello World";
|
||
string str2 = "STRING2";
|
||
|
||
// 用给定字符串或string替换指定部分 可以用起始位置索引+替换字符个数指定范围,也可以用迭代器起止指定
|
||
// 用于替换的字符串或string也可以指东圃
|
||
str.replace(2, 10, "NIHAOAHAHAHAH");
|
||
cout << str << endl;
|
||
|
||
// 指定位置以后到结束的子串
|
||
string str3 = str.substr(5);
|
||
cout << str3 << endl;
|
||
|
||
// 指定起始位置和字符数量的子串
|
||
str3 = str.substr(5, 2);
|
||
cout << str3 << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="查找">查找</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "Hello World";
|
||
string str2 = "STRING2";
|
||
|
||
// 查找给定的子串(字符串或另一个string),若存在则返回第一个符合的子串开始的位置,不存在则返回-1 (string::npos,转为有符号整型后为-1)
|
||
cout << str.find("ll") << endl;
|
||
cout << (int)str.find("WDDS") << endl;
|
||
|
||
// 可以指定开始查找的位置
|
||
cout << str.find("Wor", 5) << endl;
|
||
cout << str.find("Wor", 9) << endl;
|
||
|
||
// 用法同find, 但是从后开始查找,返回倒数第一个符合的子串开始位置,查找不到则返回string::npos
|
||
cout << str.rfind("o") << endl;
|
||
|
||
// 写不动文档了,find_first_of find_first_not_of find_last_of find_last_not_of大家有兴趣自行试一下
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="其他操作">其他操作</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "1234ABCD";
|
||
|
||
// string转为数值
|
||
int a1 = stoi(str);
|
||
cout << a1 << endl;
|
||
|
||
// 数值转为string
|
||
string str2 = "Hello From number" + to_string(100032);
|
||
cout << str2 << endl;
|
||
|
||
// 生成字符串hash
|
||
hash<string> hs1;
|
||
cout << "hash of str = " << hs1(str) << endl;
|
||
cout << "hash of str2 = " << hs1(str2) << endl;
|
||
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h2 class="atx" id="string_view">string_view</h2>
|
||
<p>用于解决string在参数传递时内容会复制问题,可以减少开销,提升性能。</p>
|
||
<pre><code class="fenced-code-block language-c++">void fun1(string str)
|
||
{
|
||
cout << "fun1 str.data() = " << (uintptr_t)str.data() << endl;
|
||
}
|
||
|
||
void fun2(string &str)
|
||
{
|
||
cout << "fun2 str.data() = " << (uintptr_t)str.data() << endl;
|
||
}
|
||
|
||
void fun(string_view sv)
|
||
{
|
||
cout << "fun string_view data() = " << (uintptr_t)sv.data() << endl;
|
||
}
|
||
|
||
|
||
|
||
int main()
|
||
{
|
||
char s[] = "西风烈,长空雁叫霜晨月";
|
||
cout << "char s[]地址 = " << (uintptr_t)s << endl;
|
||
string str(s);
|
||
cout << "str.data()地址 = " << (uintptr_t)str.data() << endl;
|
||
string str2(str);
|
||
cout << "str2.data()地址 = " << (uintptr_t)str2.data() << endl;
|
||
|
||
fun1(s);
|
||
fun1(str);
|
||
|
||
// fun2不能接收char*
|
||
fun2(str);
|
||
// fun2(s);
|
||
|
||
string_view sv1(s);
|
||
string_view sv2(str);
|
||
cout << "sv1.data()地址 = " << (uintptr_t)sv1.data() << endl;
|
||
cout << "sv2.data()地址 = " << (uintptr_t)sv2.data() << endl;
|
||
|
||
fun(s);
|
||
fun(sv1);
|
||
fun(str);
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="容器">容器</h1>
|
||
<h2 class="atx" id="array">array</h2>
|
||
<p>C++传统C风格的数组实际上只是一个裸数组,携带的信息很少,不像Java中的数组有边界检查以及数组大小等信息,使用的时候需要考虑的方面有很多。</p>
|
||
<p><code>std::array</code>是C++ 11中提供的一个封装了因定大小数组容器,可以用来替代传统数组。</p>
|
||
<p> </p>
|
||
<p><a href="cppref/zh/zh/cpp/container/array.html">array文档</a></p>
|
||
<p> </p>
|
||
<h3 class="atx" id="基本操作">基本操作</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <array>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||
array<int, 1> arr2;
|
||
|
||
// 用指定值填充数组
|
||
arr.fill(100);
|
||
|
||
// 访问元素 没有边界检查
|
||
arr[0] = 111;
|
||
cout << "arr[0] = " << arr[0] << endl;
|
||
cout << "arr[-1] = " << arr[-1] << endl;
|
||
cout << "arr[11] = " << arr[11] << endl;
|
||
|
||
// 访问元素 有边界检查
|
||
arr.at(2) = 1234;
|
||
cout << "arr.at(2) = " << arr.at(2) << endl;
|
||
// cout << "arr.at(-1) = " << arr.at(-1) << endl; // 会报错,终止程序
|
||
// cout << "arr.at(11) = " << arr.at(11) << endl; // 会报错,终止程序
|
||
|
||
// 访问第一个元素
|
||
arr.front() = 147852;
|
||
cout << "arr.front() = " << arr.front() << endl;
|
||
// 访问最后一个元素
|
||
arr.back() = 999;
|
||
cout << "arr.back() = " << arr.back() << endl;
|
||
|
||
// 访问底层数组
|
||
int *data = arr.data();
|
||
for (int i = 0; i < arr.size(); i++)
|
||
{
|
||
cout << "data[" << i << "] = " << data[i] << endl;
|
||
}
|
||
|
||
// 检查是否为空
|
||
cout << boolalpha;
|
||
cout << "arr.empty() = " << arr.empty() << endl;
|
||
cout << "arr2.empty() = " << arr2.empty() << endl;
|
||
|
||
// 大小
|
||
cout << "arr.size() = " << arr.size() << endl;
|
||
cout << "arr.max_size() = " << arr.max_size() << endl;
|
||
|
||
// for (int i = 0; i < arr.size(); i++)
|
||
// {
|
||
// cout << arr[i] << "\t";
|
||
// }
|
||
|
||
// C++ 11 之后的range循环
|
||
for (auto &a : arr)
|
||
{
|
||
cout << a << "\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="迭代器-1">迭代器</h3>
|
||
<p>遍历</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <array>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||
array<int, 1> arr2;
|
||
|
||
// 普通迭代器
|
||
array<int, 10>::iterator iter = arr.begin();
|
||
// C++ 11之后可以用auto
|
||
// auto iter = arr.begin();
|
||
*(iter + 2) = 11111;
|
||
for(; iter != arr.end(); iter ++)
|
||
{
|
||
cout << *iter << "\t";
|
||
}
|
||
|
||
// 返回迭代器
|
||
array<int, 10>::reverse_iterator riter = arr.rbegin();
|
||
for(; riter != arr.rend(); riter++)
|
||
{
|
||
cout << *riter << "\t";
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p>访问指针成员</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <array>
|
||
|
||
using namespace std;
|
||
|
||
class Person
|
||
{
|
||
private:
|
||
const char * name;
|
||
int age;
|
||
public:
|
||
int number;
|
||
Person() : Person("", 0, 0) {}
|
||
|
||
Person(const char *name, int age, int number) : name(name), age(age), number(number) {}
|
||
|
||
void set(const char *name, int age, int number)
|
||
{
|
||
this->name = name;
|
||
this->age = age;
|
||
this->number = number;
|
||
}
|
||
|
||
void sayHello()
|
||
{
|
||
cout << "Hello EveryBody" << endl;
|
||
cout << "My name is " << name << endl;
|
||
cout << "And I'm " << age << " years old." << endl;
|
||
cout << "My number is " << number << endl;
|
||
cout << "\n\n" << endl;
|
||
}
|
||
};
|
||
|
||
|
||
int main()
|
||
{
|
||
// array<Person, 3> persons;
|
||
// persons[0].set("Tom", 18, 112211);
|
||
// persons[1].set("Jerry", 20, 112212);
|
||
// persons[2].set("Lee", 22, 112213);
|
||
|
||
array<Person, 3> persons = {Person("Tom", 18, 112201), Person("Jerry", 20, 112202), Person("Lee", 22, 112203)};
|
||
|
||
array<Person, 3>::iterator iter = persons.begin();
|
||
for(; iter != persons.end(); iter++)
|
||
{
|
||
cout << "NUMBER = " << iter->number << endl;
|
||
iter->sayHello();
|
||
}
|
||
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h2 class="atx" id="vector">vector</h2>
|
||
<p><code>std::vector</code>是一个动态数组容器,可以在使用时动态修改数组大小。<a href="cppref/zh/zh/cpp/container/vector.html">std::array文档</a></p>
|
||
<h3 class="atx" id="构造-1">构造</h3>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <vector>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
// 无参构造
|
||
vector<int> vec1;
|
||
|
||
// 指定初始大小 用对应类型的0值填充
|
||
vector<int> vec2(5);
|
||
|
||
// 指定初始大小并用指定的值填充
|
||
vector<char> vec3(5, 'A');
|
||
|
||
// 初始化
|
||
vector<int> vec4 = {1, 2, 3, 4, 5, 6, 7};
|
||
|
||
// 用迭代器初始化
|
||
vector<int> vec5(vec4.begin(), vec4.end());
|
||
|
||
// 复制构造
|
||
vector<int> vec6(vec5);
|
||
|
||
// 移动构造
|
||
vector<int> vec7(move(vec6));
|
||
|
||
|
||
// 循环
|
||
for (auto &v : vec3)
|
||
{
|
||
cout << v << "\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<p>insert讲解一下内存重新分配的一些知识。</p>
|
||
<h3 class="atx" id="就地构造">就地构造</h3>
|
||
<p>当<code>std::vector</code>用于存放复合数据类型(结构体、类)时,直接用<code>insert</code>和<code>push_back</code>时,会多次构造和拷贝对应的对象,因此C++ 11以后容器类加入了<code>insert</code>和<code>push_back</code>对应的**就地构造(原位构造)**的插入方法<code>emplace</code>和<code>emplace_back</code>,可以只用构造一次对象,提高性能。</p>
|
||
<ul>
|
||
<li><code>emplace_back</code>参数直接为对应类的构造函数的参数</li>
|
||
<li><code>emplace</code>第一个参数为插入位置,其余参数为对应构造函数的参数</li>
|
||
</ul>
|
||
<p>示例:</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <vector>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
|
||
class Person
|
||
{
|
||
private:
|
||
string name;
|
||
int age;
|
||
int number;
|
||
public:
|
||
Person() : name("none"), age(0), number(-1)
|
||
{
|
||
cout << "Person无参构造调用" << endl;
|
||
}
|
||
|
||
Person(const string name, int age, int number) : name(name), age(age), number(number)
|
||
{
|
||
cout << "Person三参构造调用" << endl;
|
||
}
|
||
|
||
Person(const Person &person) : name(person.name), age(person.age), number(person.number)
|
||
{
|
||
cout << "Person拷贝构造调用" << endl;
|
||
}
|
||
|
||
Person(Person &&person) : name(move(person.name)), age(move(person.age)), number(move(person.number))
|
||
{
|
||
cout << "Person移动构造调用" << endl;
|
||
}
|
||
|
||
Person& operator = (const Person &other) = default;
|
||
Person& operator = (Person &&other) = default;
|
||
|
||
friend ostream& operator << (ostream& , const Person& );
|
||
|
||
};
|
||
|
||
ostream& operator << (ostream& out, const Person& person)
|
||
{
|
||
return out << "{" << "name: " << person.name
|
||
<< ", age: " << person.age
|
||
<< ", number: " << person.number << "}";
|
||
}
|
||
|
||
int main()
|
||
{
|
||
vector<Person> vec;
|
||
vec.reserve(5);
|
||
|
||
vec.push_back(Person("张三", 18, 11212));
|
||
Person person("李四", 20, 1122);
|
||
vec.push_back(person);
|
||
|
||
vec.emplace_back("王五", 22, 20012);
|
||
vec.emplace(vec.begin(), "赵六", 23, 200145);
|
||
|
||
|
||
for(auto &p : vec)
|
||
{
|
||
cout << p << endl;
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h2 class="atx" id="forward_list">forward_list</h2>
|
||
<p><code>std::forward_list</code>为单向链表。<a href="cppref/zh/zh/cpp/container/forward_list.html">std::forward_list文档</a></p>
|
||
<h3 class="atx" id="迭代器示意图">迭代器示意图</h3>
|
||
<p><img alt="" src="./img/forward_list_iterator.png"></p>
|
||
<p><strong>单向链表迭代器只能做自增,不能与数字相加减,也不能两个迭代器相减。</strong></p>
|
||
<p> </p>
|
||
<h3 class="atx" id="sort---andampandamp---reverse">sort && reverse</h3>
|
||
<p>sort是将链表数据进行升序排序,也可以自定义比较函数。reverse将链表元素进行逆序。</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <forward_list>
|
||
|
||
using namespace std;
|
||
|
||
class Person
|
||
{
|
||
private:
|
||
string name;
|
||
int age;
|
||
int number;
|
||
public:
|
||
Person() : name("none"), age(0), number(-1)
|
||
{}
|
||
|
||
Person(const string name, int age, int number) : name(name), age(age), number(number)
|
||
{}
|
||
|
||
Person(const Person &person) : name(person.name), age(person.age), number(person.number)
|
||
{}
|
||
|
||
Person(Person &&person) : name(move(person.name)), age(move(person.age)), number(move(person.number))
|
||
{}
|
||
|
||
Person& operator = (const Person &other) = default;
|
||
Person& operator = (Person &&other) = default;
|
||
|
||
int GetAge() const { return age; }
|
||
|
||
friend ostream& operator << (ostream& , const Person& );
|
||
|
||
};
|
||
|
||
|
||
ostream& operator << (ostream& out, const Person& person)
|
||
{
|
||
return out << "{" << "name: " << person.name
|
||
<< ", age: " << person.age
|
||
<< ", number: " << person.number << "}";
|
||
}
|
||
|
||
bool comp(const Person &p1, const Person &p2)
|
||
{
|
||
return p1.GetAge() < p2.GetAge();
|
||
}
|
||
int main()
|
||
{
|
||
forward_list<int> fls = {5, 6, 2, 3, 1};
|
||
|
||
// 升序排序
|
||
fls.sort();
|
||
|
||
// 配合reverse可进行降序排序
|
||
fls.sort();
|
||
fls.reverse();
|
||
|
||
for (auto &v : fls)
|
||
{
|
||
cout << v << "\t\t";
|
||
}
|
||
|
||
// 对于复合数据类型可自定义排序函数 比如按年龄排序
|
||
forward_list<Person> person_list = {{"张三", 22, 2001}, {"李四", 20, 2002}, {"王五", 21, 2003}};
|
||
person_list.sort(comp);
|
||
|
||
// 也可以用lambda表达式
|
||
// person_list.sort([](const Person &p1, const Person &p2) { return p1.GetAge() > p2.GetAge(); });
|
||
|
||
|
||
for (auto &vv : person_list)
|
||
{
|
||
cout << vv << "\t\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<h3 class="atx" id="merge----andampandamp---splice_after">merge && splice_after</h3>
|
||
<p><code>merge</code>将两个单项链表合并为一个。如果是两个已排好序的链表,则合并后按升序排列。如果两个链表无序,也能合并,但目前我还没找着按什么规则合并。</p>
|
||
<p>合并后第二个链表会直接变为空。</p>
|
||
<p><code>splice_after</code>将另一个链表的指定范围内的元素转移到本列表指定位置之后。第二个链表未指定范围则为全链表内容。</p>
|
||
<p>转移后的元素将不会继续在第二个链表中存在。</p>
|
||
<p>示例</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <forward_list>
|
||
|
||
using namespace std;
|
||
|
||
|
||
int main()
|
||
{
|
||
forward_list<int> fls = {5, 6, 2, 3, 1};
|
||
forward_list<int> fls2 = {0, 4, 17, 12, 15,18};
|
||
|
||
|
||
fls.sort();
|
||
fls2.sort();
|
||
fls2.merge(fls);
|
||
|
||
for (auto &v : fls2)
|
||
{
|
||
cout << v << "\t\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <forward_list>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
forward_list<int> fls = {5, 6, 2, 3, 1};
|
||
forward_list<int> fls2 = {11, 14, 25, 30};
|
||
forward_list<int> fls3(fls2);
|
||
forward_list<int> fls4 = {100, 200, 300, 400};
|
||
|
||
// 合并全部
|
||
fls.splice_after(fls.begin(), fls3);
|
||
|
||
// 合并指定位置之后的
|
||
auto iter = fls2.begin();
|
||
iter ++;
|
||
iter ++;
|
||
fls.splice_after(fls2.begin(), fls2, iter);
|
||
|
||
// 指定范围
|
||
auto iter2 = fls4.begin();
|
||
iter2 ++;
|
||
fls.splice_after(fls.begin(), fls4, iter2, fls4.end());
|
||
|
||
|
||
|
||
for (auto &vv : fls)
|
||
{
|
||
cout << vv << "\t\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h3 class="atx" id="unique---andampandamp---remove----andampandamp---remove_if">unique && remove && remove_if</h3>
|
||
<p><code>remove</code>移除指定值的元素</p>
|
||
<p><code>remove_if</code>移除满足指定条件的元素</p>
|
||
<p>示例</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <forward_list>
|
||
|
||
using namespace std;
|
||
|
||
// 一个元素返回true时移除对应元素
|
||
bool pre(const int &val)
|
||
{
|
||
return val > 3; // 移除大于3的元素
|
||
}
|
||
|
||
int main()
|
||
{
|
||
forward_list<int> fls = {5, 6, 2, 3, 1};
|
||
|
||
fls.remove(3);
|
||
fls.remove_if(pre);
|
||
// 也可以用lambda表达式
|
||
fls.remove_if([](const int &val) { return val > 3; });
|
||
|
||
|
||
for (auto &vv : fls)
|
||
{
|
||
cout << vv << "\t\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<p><code>unique</code>用于移除相邻重复的元素,只保留一个。不相邻的不影响。也可以自定义两个元素是否相等的比较函数来移除。</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <forward_list>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
forward_list<int> fls = {1, 1, 1, 6, 1, 3, 1};
|
||
|
||
fls.unique();
|
||
|
||
fls.unique([](const int &v1, const int &v2) { return v1 == v2; }); // 效果跟上面的一样,可以用这种方式来自定义比较函数
|
||
|
||
for (auto &vv : fls)
|
||
{
|
||
cout << vv << "\t\t";
|
||
}
|
||
return 0;
|
||
}</code></pre>
|
||
<h2 class="atx" id="list">list</h2>
|
||
<p><code>std::list</code>为双向链表。<a href="cppref/zh/zh/cpp/container/list.html">std::list文档</a></p>
|
||
<h2 class="atx" id=""></h2>
|
||
<h2 class="atx" id="stack">stack</h2>
|
||
<p><img alt="" src="file:///C:/Users/YAN/Desktop/STD/img/stack.png"></p>
|
||
<p><code>std::stack</code>为栈,是一种后进先出数据结构。<a href="cppref/zh/zh/cpp/container/stack.html">std::stack文档</a></p>
|
||
<p>示例:</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <stack>
|
||
#include <string>
|
||
/*
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
stack<string> str_stack;
|
||
|
||
// 入栈, 如果是复合数据结构,用emplace就地构造代替push入栈
|
||
str_stack.push("粒粒皆辛苦");
|
||
str_stack.push("谁知盘中餐");
|
||
str_stack.push("汗滴禾下土");
|
||
str_stack.push("锄禾日当午");
|
||
|
||
// 出栈
|
||
while(!str_stack.empty())
|
||
{
|
||
string str = str_stack.top(); // 先用top获取到栈顶元素
|
||
str_stack.pop(); // 弹出栈顶元素
|
||
cout << str << "--已出栈,感觉良好。栈里还有" << str_stack.size() << "个元素" << endl;
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p><strong>课后练习</strong></p>
|
||
<p>提供一个字符串,利用栈,判断其中的括号是否匹配。</p>
|
||
<p> </p>
|
||
<h2 class="atx" id="queue">queue</h2>
|
||
<p><code>std::queue</code>为队列,是一种先进先出数据结构。<a href="cppref/zh/zh/cpp/container/queue.html">std::queue文档</a></p>
|
||
<p><img alt="" src="./img/queue.png"></p>
|
||
<p>示例</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <queue>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
queue<const char *> q;
|
||
|
||
// 入队,如果是复合数据类型,用emplace就地构造代替push入队
|
||
q.push("张三");
|
||
q.push("李四");
|
||
q.push("王五");
|
||
|
||
// 出队
|
||
while (!q.empty())
|
||
{
|
||
const char *name = q.front(); // 先获取队首元素
|
||
q.pop(); // 将队首元素出队
|
||
cout << name << "已出队,感觉良好。队里还有" << q.size() << "个人" << endl;
|
||
}
|
||
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p><strong>课后练习</strong></p>
|
||
<p>有余力的同学可以研究一下用队列求解迷宫路径问题。</p>
|
||
<p> </p>
|
||
<h2 class="atx" id="deque">deque</h2>
|
||
<p><code>std::deque</code>是双端队列,即在队列两端都可以进行操作,也可以进行随机下标访问。其操作基本上与<code>std::vector</code>一样,比<code>std::vector</code>多了在头部进行插入和移除的操作。</p>
|
||
<p>一般来说,<code>std::vector</code>用在需要频繁进行随机下标访问的场景,如果需要频繁在头部和尾部进行插入和删除操作,则用<code>std::deque</code>。</p>
|
||
<p><a href="cppref/zh/zh/cpp/container/deque.html">std::deque文档</a></p>
|
||
<p> </p>
|
||
<h2 class="atx" id="priority_queue">priority_queue</h2>
|
||
<p><code>std::priority_queue</code>为优先队列。是一种可以根据优先级的高低确定出队顺序的数据结构。如果是复合数据类型,需要提供比较函数或者重载<kbd><</kbd>运算符。 </p>
|
||
<p><a href="cppref/zh/zh/cpp/container/priority_queue.html">std::priority_queue文档</a></p>
|
||
<p>示例</p>
|
||
<p><strong>自定义数据类型的比较</strong></p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <queue>
|
||
#include <vector>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
class Person
|
||
{
|
||
private:
|
||
int age;
|
||
string name;
|
||
|
||
public:
|
||
Person() : Person(0, "") {}
|
||
Person(const int age, const string name) : age(age), name(name) {}
|
||
|
||
int GetAge() const
|
||
{
|
||
return age;
|
||
}
|
||
|
||
friend ostream& operator << (ostream& out, const Person& person);
|
||
friend bool operator < (const Person &p1, const Person &p2);
|
||
};
|
||
|
||
|
||
ostream& operator << (ostream& out, const Person& person)
|
||
{
|
||
return out << "{" << "name: " << person.name
|
||
<< ", age: " << person.age << "}";
|
||
}
|
||
|
||
bool operator < (const Person &p1, const Person &p2)
|
||
{
|
||
return p1.age < p2.age;
|
||
}
|
||
|
||
|
||
|
||
|
||
int main()
|
||
{
|
||
priority_queue<Person> q;
|
||
q.emplace(60, "Tom");
|
||
q.emplace(70, "Jerry");
|
||
q.emplace(65, "Lee");
|
||
|
||
|
||
|
||
|
||
// 出队
|
||
while (!q.empty())
|
||
{
|
||
auto top = q.top(); // 先获取队首元素
|
||
q.pop(); // 将队首元素出队
|
||
cout << top << "\t";
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p><strong>自定义比较器</strong></p>
|
||
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
|
||
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><queue></span></span>
|
||
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></span></span>
|
||
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span>
|
||
|
||
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">class</span> <span class="token class-name">Person</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">private</span><span class="token operator">:</span>
|
||
<span class="token keyword">int</span> age<span class="token punctuation">;</span>
|
||
string name<span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">public</span><span class="token operator">:</span>
|
||
<span class="token function">Person</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">Person</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
|
||
<span class="token function">Person</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> age<span class="token punctuation">,</span> <span class="token keyword">const</span> string name<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">age</span><span class="token punctuation">(</span>age<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">name</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
|
||
|
||
<span class="token keyword">int</span> <span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">return</span> age<span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
|
||
<span class="token keyword">friend</span> ostream<span class="token operator">&</span> <span class="token keyword">operator</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>ostream<span class="token operator">&</span> out<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> person<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
<span class="token keyword">friend</span> <span class="token keyword">bool</span> <span class="token keyword">operator</span> <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token keyword">const</span> Person <span class="token operator">&</span>p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person <span class="token operator">&</span>p2<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
||
|
||
|
||
ostream<span class="token operator">&</span> <span class="token keyword">operator</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>ostream<span class="token operator">&</span> out<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> person<span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">return</span> out <span class="token operator"><<</span> <span class="token string">"{"</span> <span class="token operator"><<</span> <span class="token string">"name: "</span> <span class="token operator"><<</span> person<span class="token punctuation">.</span>name
|
||
<span class="token operator"><<</span> <span class="token string">", age: "</span> <span class="token operator"><<</span> person<span class="token punctuation">.</span>age <span class="token operator"><<</span> <span class="token string">"}"</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
|
||
<span class="token keyword">bool</span> <span class="token keyword">operator</span> <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token keyword">const</span> Person <span class="token operator">&</span>p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person <span class="token operator">&</span>p2<span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">return</span> p1<span class="token punctuation">.</span>age <span class="token operator"><</span> p2<span class="token punctuation">.</span>age<span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
|
||
|
||
<span class="token comment">// 方式一 模仿less定义比较器</span>
|
||
<span class="token keyword">struct</span> <span class="token class-name">Comp</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">bool</span> <span class="token keyword">operator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">const</span> Person<span class="token operator">&</span> p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> p2<span class="token punctuation">)</span> <span class="token keyword">const</span>
|
||
<span class="token punctuation">{</span> <span class="token keyword">return</span> p1<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">></span> p2<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
|
||
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// 方式二 定义普通比较函数</span>
|
||
<span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">const</span> Person<span class="token operator">&</span> p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> p2<span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">return</span> p1<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> p2<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
|
||
<span class="token keyword">typedef</span> <span class="token keyword">bool</span> <span class="token punctuation">(</span><span class="token operator">*</span>Comp2<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">const</span> Person<span class="token operator">&</span> p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> p2<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
||
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token comment">// 方式三 通过lambda表达式定义比较函数</span>
|
||
<span class="token keyword">auto</span> cmp3 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> Person<span class="token operator">&</span> p1<span class="token punctuation">,</span> <span class="token keyword">const</span> Person<span class="token operator">&</span> p2<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||
<span class="token keyword">return</span> p1<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> p2<span class="token punctuation">.</span><span class="token function">GetAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
||
|
||
<span class="token comment">// priority_queue<Person, vector<Person>, Comp> q;</span>
|
||
<span class="token comment">// priority_queue<Person, vector<Person>, bool (*)(const Person& p1, const Person& p2))> q(cmp);</span>
|
||
<span class="token comment">// priority_queue<Person, vector<Person>, Comp2> q(cmp3);</span>
|
||
priority_queue<span class="token operator"><</span>Person<span class="token punctuation">,</span> vector<span class="token operator"><</span>Person<span class="token operator">></span><span class="token punctuation">,</span> <span class="token keyword">decltype</span><span class="token punctuation">(</span>cmp3<span class="token punctuation">)</span><span class="token operator">></span> <span class="token function">q</span><span class="token punctuation">(</span>cmp3<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
q<span class="token punctuation">.</span><span class="token function">emplace</span><span class="token punctuation">(</span><span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"Tom"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
q<span class="token punctuation">.</span><span class="token function">emplace</span><span class="token punctuation">(</span><span class="token number">70</span><span class="token punctuation">,</span> <span class="token string">"Jerry"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
q<span class="token punctuation">.</span><span class="token function">emplace</span><span class="token punctuation">(</span><span class="token number">65</span><span class="token punctuation">,</span> <span class="token string">"Lee"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
||
|
||
|
||
|
||
<span class="token comment">// 出队</span>
|
||
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>q<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token keyword">auto</span> top <span class="token operator">=</span> q<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 先获取队首元素</span>
|
||
q<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 将队首元素出队</span>
|
||
cout <span class="token operator"><<</span> top <span class="token operator"><<</span> <span class="token string">"\t"</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
|
||
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span></code></pre>
|
||
<p> </p>
|
||
<h2 class="atx" id="set">set</h2>
|
||
<h2 class="atx" id="multiset">multiset</h2>
|
||
<h2 class="atx" id="unordered_set">unordered_set</h2>
|
||
<h2 class="atx" id="unordered_multiset">unordered_multiset</h2>
|
||
<h2 class="atx" id="map">map</h2>
|
||
<h2 class="atx" id="multimap">multimap</h2>
|
||
<h2 class="atx" id="unordered_map">unordered_map</h2>
|
||
<h2 class="atx" id="unordered_multimap">unordered_multimap</h2>
|
||
<h2 class="atx" id="span与容器">span与容器</h2>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="算法">算法</h1>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="迭代器-2">迭代器</h1>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="数值操作">数值操作</h1>
|
||
<h2 class="atx" id="-1"></h2>
|
||
<h2 class="atx" id="随机数">随机数</h2>
|
||
<h2 class="atx" id="位操作">位操作</h2>
|
||
<pre><code class="fenced-code-block language-cpp"></code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="时间日期">时间日期</h1>
|
||
<p>时间点的定义</p>
|
||
<pre><code class="fenced-code-block language-c++">chrono::system_clock::time_point tp = chrono::system_clock::now();
|
||
// 等价于
|
||
chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp = chrono::system_clock::now();</code></pre>
|
||
<p>时间点类型的转换:将纳秒时间点转为秒时间点</p>
|
||
<pre><code class="fenced-code-block language-c++">chrono::time_point<chrono::system_clock, chrono::seconds> tp2 = chrono::time_point_cast<chrono::seconds>(tp);</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="文件系统(filesystem)">文件系统(filesystem)</h1>
|
||
<p>C++ 17之后正式引入了filesystem用于遍历操作目录。命名空间为<code>std::filesystem</code>。使用多个命名空间时,不建议都使用<code>using namespace ...</code>的形式,但可以用下面的方式对命名空间进行简化别名:</p>
|
||
<pre><code class="fenced-code-block language-c++">namespace fs = std::filesystem;
|
||
|
||
fs::path pth = fs::current_path();</code></pre>
|
||
<p>如此之后则可以用<code>fs</code>代替命名空间<code>std::filesystem</code>。</p>
|
||
<p><a href="cppref/zh/zh/cpp/filesystem.html">filesystem文档</a></p>
|
||
<p> </p>
|
||
<p>示例:</p>
|
||
<p>列出当前目录下所有<code>.cpp</code>文件</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <filesystem>
|
||
|
||
using namespace std;
|
||
namespace fs = std::filesystem;
|
||
|
||
int main()
|
||
{
|
||
fs::directory_iterator diter(fs::current_path());
|
||
|
||
for (const fs::directory_entry &entry : diter)
|
||
{
|
||
if (entry.path().string().ends_with(".cpp")) // ends_with需要C++ 20才支持
|
||
{
|
||
cout << entry.path().string() << endl;
|
||
}
|
||
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="正则表达式">正则表达式</h1>
|
||
<h2 class="atx" id="regex_match">regex_match</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
#include <regex>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
// 是否为有效IP地址
|
||
regex re("^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
|
||
string str = "192.168.0.256";
|
||
cout << boolalpha << regex_match(str, re) << endl;
|
||
|
||
// 判断是否为有效邮箱地址
|
||
regex re2("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");
|
||
string str2 = "zhangsa@qq.com";
|
||
cout << boolalpha << regex_match(str2, re2) << endl;
|
||
}</code></pre>
|
||
<h2 class="atx" id="regex_search">regex_search</h2>
|
||
<p><code>match_results</code>两种常用特化类型</p>
|
||
<pre><code class="fenced-code-block language-c++">typedef match_results<const char*> cmatch;
|
||
typedef match_results<string::const_iterator> smatch;</code></pre>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
#include <regex>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "abc123def456ghi789jkl";
|
||
regex re("(\\d)(\\d)(\\d)");
|
||
smatch sm;
|
||
if (regex_search(str, sm, re))
|
||
{
|
||
cout << sm.str() << endl;
|
||
cout << sm.size() << endl;
|
||
cout << sm[0] << endl;
|
||
cout << sm[1] << endl;
|
||
cout << sm[2] << endl;
|
||
cout << sm[3] << endl;
|
||
cout << sm.prefix() << endl;
|
||
cout << sm.suffix() << endl;
|
||
cout << sm.position() << endl;
|
||
}
|
||
else
|
||
{
|
||
cout << "没匹配到" << endl;
|
||
}
|
||
|
||
while(regex_search(str, sm, re))
|
||
{
|
||
cout << sm.str() << "\t";
|
||
str = sm.suffix();
|
||
}
|
||
}</code></pre>
|
||
<h2 class="atx" id="regex_replace">regex_replace</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <regex>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
int main()
|
||
{
|
||
string str = "abc123def456ghi789jkl";
|
||
regex re("\\d{3}");
|
||
|
||
string str2 = regex_replace(str, re, "*");
|
||
cout << str2 << endl;
|
||
|
||
str2 = regex_replace(str, re, "($&)");
|
||
cout << str2 << endl;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="多线程">多线程</h1>
|
||
<h2 class="atx" id="mutex">mutex</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
#include <chrono>
|
||
#include <thread>
|
||
#include <mutex>
|
||
|
||
using namespace std;
|
||
|
||
int i = 0;
|
||
mutex mtx;
|
||
|
||
void tf()
|
||
{
|
||
while (i < 10)
|
||
{
|
||
mtx.lock();
|
||
lock_guard<mutex> lock(mtx);
|
||
cout << "子线程:" << i << endl;
|
||
i++;
|
||
mtx.unlock();
|
||
this_thread::sleep_for(chrono::milliseconds(10));
|
||
}
|
||
|
||
}
|
||
|
||
int main()
|
||
{
|
||
thread th(tf);
|
||
while (i < 10)
|
||
{
|
||
mtx.lock();
|
||
cout << "主线程进行中:" << i << endl;
|
||
i++;
|
||
mtx.unlock();
|
||
this_thread::sleep_for(chrono::milliseconds(10));
|
||
}
|
||
th.join();
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<h2 class="atx" id="lock_guard">lock_guard</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <string>
|
||
#include <chrono>
|
||
#include <thread>
|
||
#include <mutex>
|
||
|
||
using namespace std;
|
||
|
||
int i = 0;
|
||
mutex mtx;
|
||
|
||
void tf()
|
||
{
|
||
while (i < 10)
|
||
{
|
||
// mtx.lock();
|
||
lock_guard<mutex> lock(mtx);
|
||
cout << "子线程:" << i << endl;
|
||
i++;
|
||
// mtx.unlock();
|
||
this_thread::sleep_for(chrono::milliseconds(10));
|
||
}
|
||
|
||
}
|
||
|
||
int main()
|
||
{
|
||
thread th(tf);
|
||
while (i < 10)
|
||
{
|
||
// mtx.lock();
|
||
lock_guard<mutex> lock(mtx);
|
||
cout << "主线程进行中:" << i << endl;
|
||
i++;
|
||
// mtx.unlock();
|
||
this_thread::sleep_for(chrono::milliseconds(10));
|
||
}
|
||
th.join();
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<h2 class="atx" id="-2"></h2>
|
||
<h2 class="atx" id="condition_variable">condition_variable</h2>
|
||
<p>多个线程轮流输出数字</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <thread>
|
||
#include <mutex>
|
||
#include <condition_variable>
|
||
|
||
// 创建互斥量和条件变量来进行线程同步
|
||
std::mutex mtx;
|
||
std::condition_variable cv;
|
||
int current_number = 1;
|
||
|
||
void print_thread(int thread_id, int thread_count) {
|
||
for (int i = 0; i < 100; ++i) {
|
||
// 加锁
|
||
std::unique_lock<std::mutex> lock(mtx);
|
||
|
||
// 等待条件满足
|
||
cv.wait(lock, [&] { return (current_number % thread_count) == thread_id; });
|
||
|
||
// 输出数字
|
||
std::cout << "Thread " << thread_id << ": " << current_number << std::endl;
|
||
|
||
// 增加数字并通知其他线程
|
||
++current_number;
|
||
cv.notify_all();
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
const int num_threads = 3; // 定义线程数量
|
||
|
||
// 创建多个线程
|
||
std::vector<std::thread> threads;
|
||
for (int i = 0; i < num_threads; ++i) {
|
||
threads.emplace_back(print_thread, i, num_threads);
|
||
}
|
||
|
||
// 唤醒第一个线程开始输出
|
||
cv.notify_all();
|
||
|
||
// 等待所有线程执行完毕
|
||
for (auto& t : threads) {
|
||
t.join();
|
||
}
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<p>启动三个线程轮流输出ABC</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <thread>
|
||
#include <mutex>
|
||
#include <condition_variable>
|
||
|
||
using namespace std;
|
||
|
||
|
||
class PrintChar
|
||
{
|
||
private:
|
||
int loop_num;
|
||
int index;
|
||
mutex mtx;
|
||
condition_variable cv;
|
||
public:
|
||
PrintChar(int loop_num) : loop_num(loop_num), index(0) {}
|
||
void A()
|
||
{
|
||
for (int i = 0; i < loop_num; i++)
|
||
{
|
||
unique_lock<mutex> ulk(mtx);
|
||
|
||
cv.wait(ulk, [&]() { return index % 3 == 0; });
|
||
cout << "A";
|
||
this_thread::sleep_for(chrono::milliseconds(100));
|
||
index ++;
|
||
cv.notify_all();
|
||
}
|
||
|
||
}
|
||
void B()
|
||
{
|
||
for (int i = 0; i < loop_num; i++)
|
||
{
|
||
unique_lock<mutex> ulk(mtx);
|
||
|
||
cv.wait(ulk, [&]() { return index % 3 == 1; });
|
||
cout << "B";
|
||
this_thread::sleep_for(chrono::milliseconds(100));
|
||
index ++;
|
||
cv.notify_all();
|
||
}
|
||
|
||
}
|
||
void C()
|
||
{
|
||
for (int i = 0; i < loop_num; i++)
|
||
{
|
||
unique_lock<mutex> ulk(mtx);
|
||
|
||
cv.wait(ulk, [&]() { return index % 3 == 2; });
|
||
cout << "C";
|
||
this_thread::sleep_for(chrono::milliseconds(100));
|
||
index ++;
|
||
cv.notify_all();
|
||
}
|
||
|
||
}
|
||
|
||
};
|
||
|
||
int main()
|
||
{
|
||
int num = 0;
|
||
cout << "请输入循环次数:" ;
|
||
cin >> num;
|
||
|
||
PrintChar p(num);
|
||
thread th1(&PrintChar::A, &p);
|
||
thread th2(&PrintChar::B, &p);
|
||
thread th3(&PrintChar::C, &p);
|
||
|
||
th1.join();
|
||
th2.join();
|
||
th3.join();
|
||
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<h2 class="atx" id="async">async</h2>
|
||
<p>通过async启动并行计算,对比单线程计算时间</p>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <future>
|
||
|
||
using namespace std;
|
||
|
||
uint64_t parallel_sum(uint64_t begin, uint64_t end)
|
||
{
|
||
uint64_t sum = 0;
|
||
for (uint64_t i = begin; i < end; i++)
|
||
{
|
||
sum += i;
|
||
}
|
||
return sum;
|
||
}
|
||
|
||
int main()
|
||
{
|
||
auto t1 = chrono::high_resolution_clock::now();
|
||
uint64_t sum = 0;
|
||
for (uint64_t i = 0; i < 10000000; i++)
|
||
{
|
||
sum += i;
|
||
}
|
||
auto t2 = chrono::high_resolution_clock::now();
|
||
auto t = t2 - t1;
|
||
cout << sum << endl << t.count() << endl;
|
||
|
||
t1 = chrono::high_resolution_clock::now();
|
||
auto f1 = async(launch::async, parallel_sum, 0, 2000000);
|
||
auto f2 = async(launch::async, parallel_sum, 2000000, 4000000);
|
||
auto f3 = async(launch::async, parallel_sum, 4000000, 6000000);
|
||
auto f4 = async(launch::async, parallel_sum, 6000000, 8000000);
|
||
auto f5 = async(launch::async, parallel_sum, 8000000, 10000000);
|
||
sum = f1.get() + f2.get() + f3.get() + f4.get() + f5.get();
|
||
t2 = chrono::high_resolution_clock::now();
|
||
t = t2 - t1;
|
||
cout << sum << endl << t.count() << endl;
|
||
|
||
return 0;
|
||
}</code></pre>
|
||
<h2 class="atx" id="promise-future">promise future</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <vector>
|
||
#include <thread>
|
||
#include <future>
|
||
#include <iostream>
|
||
#include <chrono>
|
||
|
||
using namespace std;
|
||
|
||
void sumfromto(int start, int end, promise<int> ps)
|
||
{
|
||
int sum = 0;
|
||
for (int i = start; i <= end; i++)
|
||
{
|
||
sum += i;
|
||
}
|
||
ps.set_value(sum);
|
||
}
|
||
|
||
int main()
|
||
{
|
||
promise<int> ps;
|
||
future<int> sum_future = ps.get_future();
|
||
thread th(sumfromto, 1, 100, move(ps));
|
||
cout << sum_future.get() << endl;
|
||
th.join();
|
||
}</code></pre>
|
||
<h2 class="atx" id="原子操作">原子操作</h2>
|
||
<pre><code class="fenced-code-block language-c++">#include <iostream>
|
||
#include <vector>
|
||
#include <chrono>
|
||
#include <thread>
|
||
#include <mutex>
|
||
#include <atomic>
|
||
|
||
using namespace std;
|
||
|
||
// int total(0);
|
||
atomic_int total(0);
|
||
mutex mtx;
|
||
|
||
void fun()
|
||
{
|
||
for (int i = 0; i < 1000000; i++)
|
||
{
|
||
// mtx.lock();
|
||
total ++;
|
||
total --;
|
||
// mtx.unlock();
|
||
}
|
||
|
||
}
|
||
|
||
int main()
|
||
{
|
||
auto start = chrono::steady_clock::now();
|
||
|
||
vector<thread> vec;
|
||
for (int i = 0; i < 8; i++)
|
||
{
|
||
vec.emplace_back(fun);
|
||
}
|
||
|
||
for (int i = 0; i < 8; i++)
|
||
{
|
||
vec[i].join();
|
||
}
|
||
cout << "total = " << total << endl;
|
||
auto end = chrono::steady_clock::now();
|
||
auto dur = chrono::duration_cast<chrono::milliseconds>(end - start);
|
||
cout << dur << endl;
|
||
return 0;
|
||
}</code></pre>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="通用工具库">通用工具库</h1>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="语言支持库">语言支持库</h1>
|
||
<h2 class="atx" id="三路比较">三路比较</h2>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th align="center">序列类型</th>
|
||
<th align="center">特点</th>
|
||
<th align="center">举例</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td align="center">partial_ordering</td>
|
||
<td align="center">1. 等价的值不一定完全相等,a等价于b,可能存在函数F,F(a)不等于F(b)<br>2. 存在不能比较的值</td>
|
||
<td align="center">1. 0.0和-0.0虽然 等价,但二进制值不同,如果函数F为取两者的二进制值,则F(0.0)和F(-0.0)不相等<br>2. 浮点数当中NaN即为不可比较值</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center">weak_ordering</td>
|
||
<td align="center">1. 等价的值并不一定完全相等。a等价于b,可能存在函数F,F(a)不等于F(b)<br>2. 不存在不能比较的值</td>
|
||
<td align="center">以忽略大小写的方式比较"ABC"和"abc"是等价的,但是这并不是完全相同的两个值</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center">strong_ordering</td>
|
||
<td align="center">1. 等价的值完全相等,只要a==b, 就有F(a)==F(b)<br>2. 不存在不能比较的值</td>
|
||
<td align="center"></td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h1 class="atx" id="其他">其他</h1>
|
||
</article>
|
||
</body>
|
||
</html> |