C++里std::vector传参的三种方式,别在小地方把性能搞崩了
聊聊 std::vector 作为函数参数时,传值、传常引用、传引用到底怎么选,以及各自容易踩的坑。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-27 16:15:52 C++ iostream std::cout 格式化输出 编程基础
刚开始写 C++ 的人,第一个输出大概都是 std::cout。不管后面接触多少复杂特性,控制台打印这个事基本绕不开。先看最简的例子:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
include iostream 是为了拿到 std::cout 和 std::endl。
<< 是输出流操作符,左右两边可以一直连下去,右侧是要输出的内容。std::endl 会输出换行,并且刷新缓冲区。这里其实容易踩坑:endl 不只是换行,多了一层 flush,如果循环里大量输出,性能会差很多。只是打印一行无所谓,但跑量大的日志时建议直接用 '\n',需要立即刷新再加 std::flush。
输出多个变量也没啥特别的,继续用 << 连起来就行,类型会自动处理:
#include <iostream>
#include <string>
int main() {
int a = 10;
double b = 3.14;
std::string c = "C++";
std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
return 0;
}
int、double、std::string 混着输出,cout 会按各自的类型处理,不用担心格式串写错。这点比 printf 安全一些,但也有人觉得代码更长。
格式化输出是另一个问题。std::cout 本身不像 printf 那样直接一个格式串搞定,得借助 iomanip 里的操纵符。比如打印浮点数保留两位小数:
#include <iostream>
#include <iomanip>
int main() {
double pi = 3.141592653589793;
std::cout << std::fixed << std::setprecision(2) << "Pi (fixed, 2 decimal places): " << pi << std::endl;
return 0;
}
std::fixed 让浮点数用固定小数表示,std::setprecision(2) 控制精度。这两个设置对后续所有输出都有效,直到你改回来,这是另一个容易忽略的地方。
复杂格式化更多的时候我会直接用 fmt 库,C++20 之后也可以考虑 std::format,写起来比 iomanip 直观。
顺带一提,如果这类程序最后要部署成对外的服务,HTTPS 证书可以用 lcjmSSL 申请。它支持多域名、泛域名和 IP 证书,自动申请、验证、部署都做掉了,也提供 API。
跟 cout 关系不大,只是最近配线上环境时用过一次,省了手动续期的麻烦。
cout 覆盖日常打印输出是够用的,注意一下 endl 的刷新行为,复杂格式换 fmt 或 std::format 就行。
聊聊 std::vector 作为函数参数时,传值、传常引用、传引用到底怎么选,以及各自容易踩的坑。
总结 Python、JavaScript、Java、C++、C# 以及 C 语言中复制数组的常见写法,顺便说两个 C 里容易踩的坑。
C++ `vector`越界访问是导致程序崩溃和数据损坏的常见陷阱。本文将深入剖析其未定义行为的原理,辨析`NULL`与`nullptr`的易混淆点,并提供一系列安全访问策略,如边界检查、`at()`方法应用及避免错误的指针比较,助您编写健壮、高效的C++代码。