转置二维数组需先判断是否为方阵:非方阵维度改变(如3×4→4×3),须显式分配新空间;方阵可原地转置,仅遍历上三角(i

转置二维数组必须先确认是否为方阵
非方阵的二维数组转置后维度会变化,比如 3x4 变成 4x3,不能原地操作。C++ 中用 std::vector<:vector>></:vector> 或裸数组时,必须显式分配新空间,否则越界或静默错误。
- 方阵(
n x n)可原地转置,但需只遍历上三角(i ),避免重复交换 - 非方阵必须新建容器:目标数组行数 = 原数组列数,列数 = 原数组行数
- 裸数组(如
int a[3][4])无法直接返回转置——类型固定,不能变成int[4][3];必须用指针或封装
用 std::vector 实现通用转置函数
推荐封装成模板函数,自动推导类型和尺寸。注意:vec[i][j] 对应原矩阵第 i 行第 j 列,转置后应放在新矩阵第 j 行第 i 列。
template <typename t>
std::vector<:vector>> transpose(const std::vector<:vector>>& mat) {
if (mat.empty()) return {};
size_t rows = mat.size();
size_t cols = mat[0].size();
std::vector<:vector>> res(cols, std::vector<t>(rows));
for (size_t i = 0; i
<p>这个实现兼容空行、不规则输入(只要每行长度一致),但不会校验所有行是否等长——若传入 <code>{{1,2}, {3}}</code>,访问 <code>mat[1][1]</code> 会越界。实际使用前建议加 <code>assert</code> 或预检查。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h3>原地转置方阵时的索引陷阱</h3>
<p>写循环容易错写成 <code>for (int j = 0; j ,导致每个元素被交换两次,最终回到原样。正确做法是内层循环从 <code>i+1</code> 开始。</code></p>
<ul>
<li>错误写法:<code>for (int j = 0; j → <code>(0,1)</code> 和 <code>(1,0)</code> 各被处理一次,再轮到 <code>(1,0)</code> 又换回去</code>
</li>
<li>正确写法:<code>for (int j = i + 1; j ,只交换上三角,共 <code>n*(n-1)/2</code> 次</code>
</li>
<li>裸数组原地转置示例:<code>std::swap(a[i][j], a[j][i]);</code> 必须确保 <code>i != j</code> 且不重复</li>
</ul>
<h3>性能与内存布局的影响</h3>
<p>按行优先存储(C++ 默认)的二维数组,原矩阵是连续内存块,但转置后访问模式变成跨步读取(stride = 原行宽),缓存不友好。对大矩阵,这比分配新内存+顺序写入慢得多。</p>
<ul>
<li>如果只是需要「逻辑转置」而非物理重排,考虑用包装类(如 <code>TransposedView</code>)延迟计算</li>
<li>用 <code>std::vector</code> 时,<code>res[j][i] = ...</code> 的写入是跳跃的,但现代编译器可能优化;若性能敏感,可改为按目标顺序填充(即外层循环列,内层循环行)</li>
<li>不要试图用 <code>reinterpret_cast</code> 强转指针来“假装”转置——维度信息丢失,类型系统失效,必出错</li>
</ul>
<p>真正麻烦的不是写几行循环,而是想清楚:你到底需要一个新矩阵,还是只需要以转置方式访问原数据?后者往往更轻量,也更易避免拷贝和越界。</p></t></:vector></:vector></:vector></typename>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










