6
0
0

C++ 全排列输出格式化:场宽控制完全指南

2026-02-15
2026-08-13
文章摘要
|

引言

在算法竞赛和实际开发中,全排列生成是常见需求。当需要输出大量排列时,整齐的排版能显著提升可读性。本文基于文档中的 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 + setwprintf
语法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   (左对齐,空格填充)

最佳实践建议

  1. 推荐方案:对于 C++ 项目,建议使用 cout + setw,符合 C++ 面向对象风格
  2. 性能考虑:两种方案在性能上无显著差异,可基于团队习惯选择
  3. 格式化原则
    • 数字通常右对齐更美观
    • 场宽设置应考虑最大数字长度
    • 适当使用填充字符提升可读性

总结

文档中提到的“每个数字保留 5 个场宽”要求,通过 setw()printf都能完美实现。场宽控制是全排列输出格式化的关键技巧,能显著提升代码输出的可读性和专业性。选择哪种方案取决于项目规范和开发团队的技术偏好。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论