You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中auto隐式类型推导疑问及LeetCode子序列匹配问题咨询

关于auto推导与upper_bound返回类型的问题解答

嗨,我来帮你把这个问题理清楚~

一、auto会推导成什么类型?

首先得结合你代码里upper_bound的调用场景来看——在「匹配子序列的单词数」这道题的经典解法中,我们通常会先预处理一个二维数组(比如vector<vector<int>> pos),其中pos[c]存储了原字符串s中字符c出现的所有下标。当你对pos[c]调用upper_bound时,你其实是在对内层的vector<int>容器进行查找操作。

根据C++标准,upper_bound的返回值类型和你传入的容器的迭代器类型完全一致:

  • 如果pos[c]是普通的vector<int>,那么upper_bound返回的是vector<int>::iterator;
  • 如果pos[c]是const vector<int>(比如你是通过const引用访问的),则返回vector<int>::const_iterator。

而auto会自动推导为上面对应的迭代器类型,不需要你手动写冗长的类型名。

二、显式声明类型的正确方式

你之前误以为loc是vector<vector<int>>的迭代器,这里其实有个小误区:vector<vector<int>>的迭代器指向的是整个内层vector<int>元素,而你调用upper_bound是针对其中一个内层vector<int>进行的,所以返回的是内层容器的迭代器。

显式声明的话,你有两种选择:

  1. 直接写完整的迭代器类型:

    vector<int>::iterator loc = upper_bound(pos[c].begin(), pos[c].end(), current_pos);
    

    如果涉及const场景,就换成vector<int>::const_iterator。

  2. 用decltype来自动推导类型(更灵活,适合容器类型可能变化的场景):

    decltype(pos[0].begin()) loc = upper_bound(pos[c].begin(), pos[c].end(), current_pos);
    

这样写就完全符合upper_bound的返回值类型了。

内容的提问来源于stack exchange,提问作者Ganpat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:47:44