"自动"隐式映射到什么?

What does `auto` implicitly map to?

本文关键字:quot 什么 自动 映射      更新时间:2023-10-16

我正在尝试解决有关LeetCode(https://leetcode.com/problems/number-of-matching-subsequences/description/)的问题。

我在一些在线帮助下编写的代码如下:

class Solution {
public:
//Reference: https://leetcode.com/problems/number-of-matching-subsequences/discuss/117575/C++-12-Line-Solution-with-Explanation
int numMatchingSubseq(string S, vector<string>& words) {
vector<vector<int>> dict(26);
for(int i=0; i<S.size(); i++)
dict[S[i]-'a'].push_back(i);
int counter=0;
for(string& word: words) {
int x=-1;
bool found=true;
vector<vector<int>>::iterator loc=dict.begin();
for(const char& ch: word) {
// auto loc=upper_bound(dict[ch-'a'].begin(), dict[ch-'a'].end(), x);
loc=upper_bound(dict[ch-'a'].begin(), dict[ch-'a'].end(), x);
if(loc==dict[ch-'a'].end()) found=false;
else x=*loc;
}
if(found) counter++;
}
return counter;
}
};

原始代码使用关键字auto作为loc的数据类型。 根据我的理解,loc应该是vector<vector<int>>()的迭代器,因为upper_bound()按照 cppreference.com(http://en.cppreference.com/w/cpp/algorithm/upper_bound)返回迭代器。

但是,将loc声明为vector<vector<int>>iterator会给我一个编译错误:

第 19 行:与 'operator=' 不匹配(操作数类型为 'std::vector>::iterator {aka __gnu_cxx::__normal_iterator*, std::vector>>}' 和 '__gnu_cxx::__normal_iterator>')

有人可以指出loc的类型吗?

谢谢。

注意:

  1. 我没有包括问题描述,因为我认为根本不需要,因为我在问一个语法问题。
  2. 我知道我显然可以使用auto. 但是,我不想。

正如@nwp在评论中指出的那样,upper_bound根据其参数推断其类型。如果你传递它一个vector<vector<int>>::iterator,那就是它将返回的内容。

但是,看看您实际传递的内容:

loc=upper_bound(dict[ch-'a'].begin(), dict[ch-'a'].end(), x);

你给它dict[char-'a'].begin().dict是一个vector<vector<int>>,所以它的operator[]返回一个vector<int>,所以你只传递它一个vector<int>::iterator。因此,您可以将其重写为:

vector<int>::iterator loc = upper_bound(dict[ch-'a'].begin(), dict[ch-'a'].end(), x);

或者干脆使用decltypeauto