推荐用嵌套std::vector构造杨辉三角:自动内存管理、按需增长;需逐行push_back初始化,避免越界;递推只依赖上一行,边界为1;打印时统一setw对齐防塌陷。

用 std::vector<:vector>></:vector> 动态构造杨辉三角更安全
直接用 int a[100][100] 静态数组写杨辉三角,看着简单,但一旦行数超限就崩溃,而且无法返回给调用方复用。C++ 里推荐用嵌套 std::vector —— 它自动管理内存,还能按需增长。
常见错误是只初始化外层 vector,忘了每行也要 resize 或用 push_back 填充:
// ❌ 错误:第二维没分配,访问 a[i][j] 会越界
vector<vector<int>> a(n);
a[0][0] = 1; // 段错误!
<p>// ✅ 正确:逐行构造,每行长度递增
vector<vector<int>> triangle;
for (int i = 0; i < n; ++i) {
triangle.push_back(vector<int>(i + 1, 1)); // 每行初值全设为 1
}</p>核心逻辑:只依赖上一行,避免重复计算
杨辉三角第 i 行第 j 列(从 0 开始)的值,只由上一行的 triangle[i-1][j-1] 和 triangle[i-1][j] 决定。边界(j == 0 或 j == i)始终为 1。
- 别在循环里反复求组合数(比如
C(n,k)),整数溢出快、性能差 - 别从左到右覆盖当前行——会污染还未读取的上一行数据;要么从右往左填,要么用独立变量暂存
- 实际只要两行空间就能滚动计算,但练习阶段建议先写清楚三重结构:初始化 → 边界处理 → 中间递推
输出对齐问题常被忽略,但影响可读性
打印时若不补空格,三角形会“塌”成直角形。关键不是用 \t(制表符宽度不固定),而是算每行前面要多少个空格:
立即学习“C++免费学习笔记(深入)”;
- 最后一行有
n个数,假设每个数最多占 4 字符(如 "1234"),那首行前面要留约2 * (n - 1)个空格 - 更稳妥的做法:先生成全部数据,再遍历找最大值位数,统一用
setw格式化 - 调试时可先关闭对齐,确认数值正确后再加格式;否则数值错+排版乱,双倍难排查
示例片段(仅对齐逻辑):
int width = to_string(triangle.back().back()).length();
for (int i = 0; i < n; ++i) {
cout << string((n - i - 1) * width, ' '); // 左侧缩进
for (int x : triangle[i]) {
cout << setw(width) << x << " ";
}
cout << "\n";
}
输入校验和边界情况必须手动处理
n = 0 或 n = 1 是高频出错点。标准库不会帮你判断“用户输了个负数”,也不会自动返回空三角。
n :应直接返回空 <code>vector,而不是继续执行导致未定义行为-
n == 1:只有一行{1},别漏掉这个特例,否则循环从i = 1开始就跳过了 - 如果函数要返回三角,签名建议用
vector<vector>> generate(int numRows)</vector>,而不是 void + 传引用——语义清晰,也方便单元测试
真正容易卡住的,往往是第 0 行怎么建、第 1 行怎么填、循环下标从 0 还是 1 起——这些细节不写出来,光看公式根本没法 debug。











