`auto`隐含映射到什么?

时间:2018-03-06 23:11:56

标签: c++ syntax iterator

我正在尝试解决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声明为iteratorvector<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的类型吗?

感谢。

注意:

  1. 我不包括问题描述,因为我不认为这是必要的,因为我在问一个句法问题。
  2. 我知道我显然可以使用auto。但是,我不想。

1 个答案:

答案 0 :(得分:1)

作为@nwp points out in the commentsupper_bound根据其参数推断出其类型。如果你传递的是vector<vector<int>>::iterator而不是它将返回的内容。

但是,看看你实际传递的是什么:

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

您正在给它dict[char-'a'].begin()dictvector<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}}