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>进行的,所以返回的是内层容器的迭代器。
显式声明的话,你有两种选择:
直接写完整的迭代器类型:
vector<int>::iterator loc = upper_bound(pos[c].begin(), pos[c].end(), current_pos);如果涉及const场景,就换成
vector<int>::const_iterator。用
decltype来自动推导类型(更灵活,适合容器类型可能变化的场景):decltype(pos[0].begin()) loc = upper_bound(pos[c].begin(), pos[c].end(), current_pos);
这样写就完全符合upper_bound的返回值类型了。
内容的提问来源于stack exchange,提问作者Ganpat
相关产品推荐
相关产品推荐

