为什么这个 std::vector 会给出运行时错误?

2024-01-03

vector<int> matchingStrings(vector<string> s, vector<string> q) {
        
        vector<int> res;
        map<string, int> mp;
        for(int i = 0 ; i < s.size();i++){
            mp[s[i]]++;
        }
        
        for(int i = 0 ; i < q.size();i++){
                res[i] = mp[q[i]]; 
        }
        return res;
}

The problem你有一个空向量并写:

res[i];

你正在尝试访问它的ith 不存在的元素。 你可以solve这通过使用push_back on res如下:

res.push_back(mp[q[i]]);//you could use emplace_back here instead

另外我想在这里给出两个建议:

  1. Use .at()代替[] on the std::map每当您不想创建无意的元素时。

  2. 在这种情况下你也可以使用emplace_back代替push_back.

考虑到建议的第 2 点,您可以将上述建议的语句写为:

res.emplace_back(mp[q[i]]); //use .at() only if you don't want to create/add elements into the map and just want to read

所以修改后的代码将如下所示:

vector<int> matchingStrings(vector<string> s, vector<string> q) {
        
        vector<int> res;//res is an empty vector
        map<string, int> mp;
        for(int i = 0 ; i < s.size();i++){
            mp[s[i]]++;
        }
        
        for(int i = 0 ; i < q.size();i++){
                res.emplace_back(mp[q[i]]); //used emplace_back
        }
        return res;
}

替代解决方案:

Create res具有特定的尺寸。

vector<int> res(q.size());//res has size equal to q's size

现在你可以使用res[i];安全并且有no need to use push_back and emplace_back.

所以修改后的代码将如下所示:

vector<int> matchingStrings(vector<string> s, vector<string> q) {
        
        vector<int> res(q.size());//res has size q
        map<string, int> mp;
        for(int i = 0 ; i < s.size();i++){
            mp[s[i]]++;
        }
        
        for(int i = 0 ; i < q.size();i++){
                res[i] = mp[q[i]]; //res[i] is fine now 
        }
        return res;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个 std::vector 会给出运行时错误? 的相关文章

随机推荐