将函数的返回向量分配给另一个向量时发生分段错误

时间:2019-03-09 05:37:13

标签: c++ vector hashtable

我的一项家庭作业遇到了问题,其中我们需要使用哈希表检测字符串向量中的重复字符串。我的代码可以很好地构建和编译,但是当我尝试将重复检测算法中的返回向量分配给重复向量时,出现了分段错误。我试图弄清楚为什么会发生这种情况,但找不到解决方案。我在下面附加了我的代码。

使用哈希表##查找重复项的功能

 std::vector<std::string>find_duplicates_with_hashtable(std::vector<std::string> & strings) {

        std::vector<std::string> dups;
        typedef std::unordered_map<std::string, std::string> hashtable;
        hashtable table;

        for (std::vector<std::string>::iterator i = strings.begin(); i < strings.end(); i++) {
        std::unordered_map<std::string, std::string>::const_iterator it = table.find(*i);
        if (it != table.end() && (std::find(dups.begin(), dups.end(), *i)) == dups.end()) {
            dups = find_duplicates_with_sorting(dups); // line causing the problem
        }
        table.emplace(*i, *i);
        }

        return dups; 
  }

用于检查给定向量中是否存在任何元素的函数

std::vector<std::string> find_duplicates_with_sorting(std::vector<std::string> & strings) {
    std::vector<std::string> dups;

    std::sort(strings.begin(), strings.end());

    for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
        if( strings[i].compare(strings[i+1]) == 0 ) {
            std::string found_dup = strings[i];
            if( dups.size() == 0 ) {
                dups.push_back(found_dup);
            }
            else
            {
                std::string last_found_dup = dups[ dups.size() - 1 ];
                if( last_found_dup.compare(found_dup) != 0 ) {              // Not a dup of a dup
                    dups.push_back(found_dup);
                }
            }
        }
    }

    return dups;
}

这是哈希表函数被调用的上下文

TEST(BaseHash, SuperShortVector)
{
    std::vector<std::string> dups_found;
    auto & search_vector      = super_short_vector;
    auto & known_dups_vector  = super_short_vector_dups;

    dups_found = find_duplicates_with_hashtable(search_vector);

    std::sort(dups_found.begin(), dups_found.end());
    std::sort(known_dups_vector.begin(), known_dups_vector.end());


}

导致问题的行在“ find_duplicates_with_hashtable”函数中用注释标记

此外,由于这是一项家庭作业,如果有人可以解释我做错了什么,并给我一个我可以解决的一般方向以解决此问题,我将不胜感激,因为只需粘贴粘贴代码不会帮我学习

对不起,如果代码太可怕了。我在理解如何使用哈希表时遇到了麻烦。

谢谢:)

1 个答案:

答案 0 :(得分:2)

段错误发生在这里:

for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
        if( strings[i].compare(strings[i+1]) == 0 ) {

问题在于,您正在将无符号值i与从strings.size() - 1返回的无符号值进行比较。当strings.size()0时,这部分i < strings.size() - 1将检查i是否小于最大整数值,该整数将(基本上)始终为真。

strings[i+1]的长度为0或1时,这会导致strings发生段错误。

可以通过多种方式解决此问题,但是for( int i = 0; i < (int)strings.size() - 1; ++i ) {是一种快速而肮脏的解决方法。