我正在尝试解决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
声明为iterator
到vector<vector<int>>
会给我一个编译错误:
第19行:&#39;运营商=&#39; (操作数类型是&#39; std :: vector&gt; :: iterator {aka __gnu_cxx :: __ normal_iterator *,std :: vector&gt;&gt;}&#39;和&#39; __ gnu_cxx :: __ normal_iterator&gt;& #39)
有人可以指出loc
的类型吗?
感谢。
注意:
auto
。但是,我不想。答案 0 :(得分:1)
作为@nwp points out in the comments,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);
。因此,您可以将其重写为:
decltype
或者只使用auto
或{{1}}