向量插入期间引用绑定到空指针错误

时间:2019-03-14 21:05:40

标签: c++

我正在尝试解决特定的leetcode问题,但似乎无法弄清楚哪里出了错。

问题是这个:https://leetcode.com/problems/group-anagrams/ 我的代码是:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& str) {
        unordered_map<string, vector<int>> map;
        vector<string> newstr = str;
        int size = str.size();
        //pushing those indices of `str` into the map which share common permutation
        for(int i=0; i<size; i++){
            sort(newstr[i].begin(), newstr[i].end());
            map[newstr[i]].push_back(i);
        }

        vector<vector<string>> ans;
        int i=0;
        for(auto itr: map){
            int v_size = itr.second.size();
            for(int j=0; j<v_size; j++)
                //cout<<str[itr.second[j]]<<" "; //this query works perfectly
                ans[i].push_back(str[itr.second[j]]); //erroneous code
            i++;
        }
        return vector<vector<string>>();
        // return ans;
    }
};

2 个答案:

答案 0 :(得分:4)

您正在访问ans[i],而没有事先在ans中分配任何内存。这将创建超出向量范围(0)的数据访问。 如果要向ans添加新矢量,请使用ans.push_back()。正如balki所说,您还可以通过在声明时分配所有条目来删除冗余分配,如下所示:

vector<vector<string>> ans { map.size() };

这将使您的代码正常工作,而无需进行任何其他更改(据我所知)。

答案 1 :(得分:1)

使用时

ans[i].push_back(str[itr.second[j]]);

i必须是有效的索引。由于您在调用之前尚未向ans添加任何项目,因此ans为空,并且出现了越界索引错误。更改定义ans的行,以适当的大小对其进行初始化。

代替

vector<vector<string>> ans;

使用

vector<vector<string>> ans(map.size());

第二种选择是在循环中创建一个std::vector<std::string>并将其添加到ans

for(auto itr: map){
    int v_size = itr.second.size();

    std::vector<std::string> v;
    for(int j=0; j<v_size; j++)
        v.push_back(str[itr.second[j]]);

    ans.push_back(v);
}
相关问题