在C++中,lower_bound
返回的是一个迭代器(iterator),而不是直接的下标位置。因此,为了得到数组中的索引(即 pos1
),你需要用返回的迭代器减去数组的起始地址(num
)。
详细解释:
-
lower_bound
的返回值:-
lower_bound(num, num+6, 7)
返回的是一个指针(对于数组而言,迭代器就是指针),指向第一个 ≥7 的元素(在这里就是7
本身)。 -
它的实际值是
&num[3]
(即7
的地址)。
-
-
为什么要减去
num
?-
num
是数组的首地址(即&num[0]
)。 -
lower_bound(...) - num
实际上是计算两个指针之间的偏移量,即:cpp
复制
&num[3] - &num[0] = 3
这样就得到了
7
在数组中的索引3
。
-
-
如果不减去
num
,会怎么样?-
如果不减,
pos1
就是一个指针(地址),而不是整数索引。 -
如果你尝试直接赋值给
int pos1
,编译器会报错,因为类型不匹配(指针不能直接赋值给int
)。
-
正确用法:
int num[6] = {1, 2, 4, 7, 15, 34}; int pos1 = lower_bound(num, num+6, 7) - num; // pos1 = 3
错误情况:
int pos1 = lower_bound(num, num+6, 7); // 错误!返回的是指针,不能直接赋值给int
总结:
-
lower_bound
返回的是迭代器/指针,要得到数组下标,必须减去数组首地址num
。 -
类似的情况也适用于
upper_bound
和其他返回迭代器的STL算法。
如果是 vector
,也可以用 std::distance
计算索引:
vector<int> v = {1, 2, 4, 7, 15, 34}; int pos1 = distance(v.begin(), lower_bound(v.begin(), v.end(), 7)); // pos1 = 3