引言
在算法竞赛和实际开发中,全排列生成是常见需求。当需要输出大量排列时,整齐的排版能显著提升可读性。本文基于文档中的 STL 全排列代码,详细讲解如何实现“每个数字保留 5 个场宽”的规范输出,并提供多种实现方案。
核心概念:场宽(Field Width)
场宽是指输出数据在屏幕上所占用的最小字符宽度。通过设置场宽,可以确保数据对齐,使输出结果整齐美观。在 C++ 中,主要有两种方式控制场宽:
方案一:使用 cout + setw(C++ 标准方式)
代码实现
#include <iostream>
#include <iomanip> // 必需头文件
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int s[n];
for(int i = 0; i < n; i++) {
s[i] = i + 1;
}
do {
for(int i = 0; i < n; i++) {
cout << setw(5) << s[i]; // 关键:设置5字符场宽
}
cout << endl;
} while(next_permutation(s, s + n));
return 0;
}
技术要点
- setw(5):设置字段宽度为 5 个字符
- 对齐方式:默认右对齐(适合数字输出)
- 填充字符:默认空格
- 作用范围:仅对下一个输出项有效
方案二:使用 printf(C 风格,简洁高效)
代码实现
#include <iostream>
#include <cstdio> // 必需头文件
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int s[n];
for(int i = 0; i < n; i++) {
s[i] = i + 1;
}
do {
for(int i = 0; i < n; i++) {
printf("%5d", s[i]); // 关键:%5d 设置5字符场宽
}
printf("\n");
} while(next_permutation(s, s + n));
return 0;
}
技术要点
- %5d:格式化字符串,5 表示场宽,d 表示整数
- 对齐方式:默认右对齐
- 填充字符:空格
- 优势:语法简洁,熟悉 C 语言的开发者更易理解
输出效果对比
未设置场宽
123
132
213
...
设置 5 字符场宽
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
两种方案对比表
| 特性 | cout + setw | printf |
|---|---|---|
| 语法 | cout << setw(5) << s[i] | printf("%5d", s[i]) |
| 头文件 | <iomanip> | <cstdio> |
| 对齐方式 | 默认右对齐 | 默认右对齐 |
| 填充字符 | 空格 | 空格 |
| 类型安全 | 是 | 否(需手动匹配格式) |
| 可读性 | 面向对象风格 | 格式化字符串风格 |
| 适用场景 | C++ 项目 | 混合编程、性能敏感场景 |
扩展技巧
自定义填充字符
// cout 方式
cout << setw(5) << setfill('*') << s[i]; // 输出:***12
// printf 方式
printf("%05d", s[i]); // 输出:00012(用0填充)
左对齐设置
// cout 方式
cout << left << setw(5) << s[i]; // 输出:12***
// printf 方式
printf("%-5d", s[i]); // 输出:12 (左对齐,空格填充)
最佳实践建议
- 推荐方案:对于 C++ 项目,建议使用
cout + setw,符合 C++ 面向对象风格 - 性能考虑:两种方案在性能上无显著差异,可基于团队习惯选择
- 格式化原则:
- 数字通常右对齐更美观
- 场宽设置应考虑最大数字长度
- 适当使用填充字符提升可读性
总结
文档中提到的“每个数字保留 5 个场宽”要求,通过 setw()或 printf都能完美实现。场宽控制是全排列输出格式化的关键技巧,能显著提升代码输出的可读性和专业性。选择哪种方案取决于项目规范和开发团队的技术偏好。