直接从下标1开始遍历数组计算arr[i]-arr[i-1],共n-1个差值;用vector需先检查size>=2;差值可正可负,取绝对值需std::abs()。

直接用循环算 arr[i] - arr[i-1] 就行
不需要额外库或函数,C++ 原生数组或 std::vector 都适用。关键点是下标从 1 开始遍历,避免越界访问 arr[-1]。
- 对长度为
n的数组,只计算n-1个差值:索引1到n-1 - 如果要用
std::vector,记得检查vec.size() >= 2,否则循环不执行或崩溃 - 差值可正可负,取决于前后顺序;若要绝对差,套一层
std::abs()
示例:
int arr[] = {5, 2, 6, 7, 8};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 1; i <h3>
<code>std::adjacent_difference</code> 是标准库捷径</h3><p>它在 <code><numeric></numeric></code> 头文件里,功能就是干这个事:把原数组相邻差填进目标容器,首元素默认复制过去。</p>
- 输出容器必须预留足够空间(至少
n个位置),否则行为未定义 - 默认计算
arr[i] - arr[i-1],但可以传自定义二元函数,比如改成abs(a-b) - 注意:它不改变原数组,只是读取;输出结果首项是
arr[0],后面才是差值
示例:
#include <numeric>
std::vector<int> src = {5, 2, 6, 7, 8};
std::vector<int> dst(src.size());
std::adjacent_difference(src.begin(), src.end(), dst.begin());
// dst == {5, -3, 4, 1, 1}</int></int></numeric>
二维数组的“相邻差”要看你指哪一种
用户常混淆两种场景:按行内相邻(每行单独算),还是展平后全局相邻(整个矩阵当一维序列)。两者逻辑完全不同。
- 行内差:外层循环行号,内层从第 1 列开始算
mat[i][j] - mat[i][j-1] - 全局相邻:把二维映射成一维索引,即
mat[r][c]对应位置r * cols + c,然后照常算前后差 - 别误用
std::adjacent_difference直接传二维容器——它不识别维度,只会把指针当一维遍历,结果取决于内存布局(通常可行但语义模糊)
容易踩的坑:越界、符号、类型溢出
看似简单,实操中这几个点最常引发 bug 或隐性错误:
- 忘记检查数组长度 ≥ 2,导致循环不执行或
i-1为负——尤其在模板函数或泛型代码里 - 用
unsigned类型存差值,2 - 5会绕成极大正数,而不是 -3 - 整数溢出:比如
INT_MIN - INT_MAX超出int表示范围,触发未定义行为;必要时转long long -
std::adjacent_difference的输出迭代器若指向只读容器(如const vector),编译不过
真正麻烦的不是“怎么算”,而是“在哪算、用什么类型存、谁负责检查边界”。这些细节一旦漏掉,调试成本远高于写几行循环。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











