lower_bound

在C++中,lower_bound 返回的是一个迭代器(iterator),而不是直接的下标位置。因此,为了得到数组中的索引(即 pos1),你需要用返回的迭代器减去数组的起始地址(num)。

详细解释:

  1. lower_bound 的返回值

    • lower_bound(num, num+6, 7) 返回的是一个指针(对于数组而言,迭代器就是指针),指向第一个 ≥7 的元素(在这里就是 7 本身)。

    • 它的实际值是 &num[3](即 7 的地址)。

  2. 为什么要减去 num

    • num 是数组的首地址(即 &num[0])。

    • lower_bound(...) - num 实际上是计算两个指针之间的偏移量,即:

      cpp

      复制

      &num[3] - &num[0] = 3

      这样就得到了 7 在数组中的索引 3

  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值