lower_bound
结果减去数组名是为了将返回的迭代器(指针)转换为数组下标(索引)。lower_bound
返回的是一个迭代器(对于数组来说就是指针),指向找到的元素位置。
int arr[] = {10, 20, 30, 40, 50};
auto it = lower_bound(arr, arr + 5, 25); // it 是指向30的指针
为什么需要减去数组名
因为有时我们需要的是位置信息而不是内存地址:
操作 | 结果 | 含义 |
---|---|---|
lower_bound(...) | 0x7ffd42a (内存地址) | 无实际意义 |
lower_bound(...) - arr | 2 (整数索引) | 第3个元素 |
指针运算的原理
在C++中,数组名就是数组的首地址(&arr[0])。指针减法计算的是两个指针之间相差的元素个数:
int* ptr1 = &arr[2]; // 指向30
int* ptr2 = &arr[0]; // 指向10
cout << ptr1 - ptr2; // 输出:2(相差2个元素)
不减数组名会怎样?
如果不减去数组名,你会得到:
一个内存地址(没有实际使用价值),如果需要访问元素,必须通过解引用 *it。