Ошибка сегментации при назначении вектора возврата функции другому вектору - PullRequest
0 голосов
/ 09 марта 2019

У меня проблема с одним из моих домашних заданий, в котором мы должны обнаружить дублирующиеся строки в векторе строк, используя хеш-таблицу. Мой код строится и компилируется нормально, но я получаю ошибку сегментации, когда пытаюсь назначить вектор возврата из алгоритма обнаружения дубликатов для вектора дубликатов. Я пытался выяснить, почему это происходит, но не могу найти решение. Я прикрепил свой код ниже.

Функция поиска дубликатов с использованием хеш-таблицы ##

 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 Ответ

2 голосов
/ 09 марта 2019

Здесь происходит ошибка по умолчанию:

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]segfault, когда strings имеет длину 0 или 1.

Это можно исправить многими способами, но for( int i = 0; i < (int)strings.size() - 1; ++i ) { будет быстрым и грязным способом исправить это.

...