Obținerea erorii „terminating with uncaught exception of type std::length_error: vector” eroare C++ (Programare, C++, C++11, Vector)

A. Ray a intrebat.
a intrebat.

Scriu un program care să ajute la rezolvarea cuvintelor încrucișate. Deci, iau un cuvânt dintr-o listă de text cu toate cuvintele din limba engleză, fac din fiecare un vector de caractere și compar acest vector cu un vector de litere de început pe care îl am. Rulează bine și îmi dă rezultate bune, dar de fiecare dată primesc o eroare „libc++abi.dylib: terminating with uncaught exception of type std::length_error: vector”.

Iată codul meu:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <iterator>

using namespace std;

string getLetters() {
    string word; // Get user letter, put in variable word
    cout << "Enter a set of letters" << endl;
    cin >> word;
    return word;
}

int getLengthOfWord() {
    int length; // Get length of word
    cout << "Enter the number of letters in the word" << endl;
    cin >> length;
    return length;
}

// Change strings to vectors of chars
vector<char> stringToVector(string word) {
    std::vector<char> v(word.begin(), word.end());
    return v;
}

bool compareVectors(vector<char> userWord, vector<char> listWord, int length) {

    if (listWord.size() != length) // Make sure the word from the list is the right length
    {
        return false;
    }

    int counter = 0; // Counter

    for (int i = 0; i < userWord.size(); i++) { // Iterating through the two words
        for (int j = 0; j < listWord.size(); j++) {
            if (listWord[j] == userWord[i]) { // If the letters match
                listWord.erase(listWord.begin() - 1 + j); // Erase the letter from the word
                counter++; // Increase counter
                break; // Break out of for loop
            }
        }
    }

    if (counter == userWord.size()) { // If there were as many matches as letters in user set
        return true;
    }
    else {
        return false;
    }

}

int main() {

    string example; // variable to put words
    ifstream wordList; // New ifstream object
    wordList.open("/Users/alexray/Dropbox/C++ Practice/WordJumbleSolver/wordsEn.txt"); //open word list

    int length = getLengthOfWord(); // Get user input
    string word = getLetters();

    vector<char> vector1(stringToVector(word));

    while (wordList.is_open()) {
        getline(wordList, example); // Get word, put it in example variable

        vector<char> vector2(stringToVector(example)); // Make word from list a vector
        vector2.erase(vector2.end() - 1); // Erase escape character from end of word
        if(compareVectors(vector1, vector2, length)) { // compare the vectors
            cout << example << endl;
        }
    }
    wordList.close(); // Close stream

    return 0;

}

După ce am căutat pe Google, am crezut că este vorba de faptul că vectorul meu nu era inițial suficient de mare pentru a gestiona unele cuvinte, dar efectuarea vector.reserve(some_number) înainte de a atribui o valoare vectorului nu a ajutat cu nimic. De asemenea, nu mi-am putut imagina că un vector ar avea probleme cu <20 de elemente.

Mulțumesc pentru ajutor! (Sunt nou în C++, așa că dacă este ceva ce ar trebui să fac în mod evident diferit, anunțați-mă).

Editează: Fișierul cu care lucrez este fișierul wordsEn.txt de pe acest site: http://www-01.sil.org/linguistics/wordlists/english/

Comentarii

  • Una dintre primele abilități esențiale de realizat cu programarea este să înveți cum să folosești debuggerul. Treceți prin programul dvs. linie cu linie și găsiți care bucată de cod declanșează excepția. –  > Por πάντα ῥεῖ.
  • dar făcând vector.reserve Aceasta nu stabilește dimensiunea vectorului. Funcția pe care o doriți este vector::resize() –  > Por PaulMcKenzie.
  • Mulțumesc, am schimbat funcția în resize, dar chiar și atunci când am redimensionat-o la o valoare ridicolă, tot apare eroarea. –  > Por A. Ray.
  • @A.Ray Conform comentariilor din codul dvs., de ce credeți că există un caracter de scăpare la sfârșitul șirului care trebuie eliminat? getline(wordList, example); // Get word, put it in example variable și aceasta vector2.erase(vector2.end() - 1); // Erase escape character from end of word? –  > Por PaulMcKenzie.
  • @PaulMcKenzie Folosind depanatorul și uitându-vă la valorile elementelor din vector. Odată ce linia este citită în variabila string și pusă într-un vector, ultimul element al vectorului este un „r”. Acesta a fost unul dintre bug-urile mele anterioare pe care a trebuit să le rezolv. –  > Por A. Ray.
2 răspunsuri
PaulMcKenzie

O problemă pe care o văd este că nu ștergeți caracterul pe care pretindeți că vreți să-l ștergeți:

listWord.erase(listWord.begin() - 1 + j); 

Acest lucru nu șterge jth caracterul din secvență.

Cel mai simplu exemplu de eșec al acestui lucru este dacă j == 0 la începutul buclei, iar primul caracter se potrivește.

Faceți pur și simplu acest lucru în loc:

listWord.erase(listWord.begin() + j); 

Comentarii

  • Mulțumesc pentru ajutor, am schimbat linia respectivă cu ceea ce ați sugerat. Nu știu de ce m-am încurcat cu indicii… Din păcate, făcând asta și redimensionând vectorul în loc de a rezerva, tot nu am reușit să scap de eroare. Aveți și alte idei? –  > Por A. Ray.
  • Atunci vă rugăm să postați datele care cauzează problema sau să introduceți datele în întrebarea dvs. pentru ca alții să poată vedea cu ce lucrați. –  > Por PaulMcKenzie.
  • Îmi pare rău, sunt nou pe StackOverflow și încă nu sunt foarte sigur de toate informațiile pe care ar trebui să le dau. Un exemplu de ieșire pe care îl obțin este: /Users/alexray/Library/Caches/clion11/cmake/generated/74a9f2b2/74a9f2b2/Debug/CrosswordSolver Introduceți numărul de litere din cuvânt 4 Introduceți un set de litere sla ails alas albs ales alls alms alps also awls gals labs lads lags lams laos laps lash lass last laws lays leas pals sail sale sale salt seal seal slab slag slam slap slat slav slaw slay libc++abi. dylib: terminare cu o excepție neacoperită de tip std::length_error: vector Procesul s-a terminat cu codul de ieșire 6 –  > Por A. Ray.
  • Mi-am editat postarea inițială cu un link către fișierul .txt pe care îl folosesc pentru programul meu. Îmi cer scuze că nu am inclus-o inițial. –  > Por A. Ray.
A. Ray

M-am uitat tot timpul în locul greșit. M-am uitat la numărul de cuvinte/linii din fișier (109582) și am schimbat

while (wordList.is_open()) {
        getline(wordList, example); // Get word, put it in example variable

        vector<char> vector2(stringToVector(example)); // Make word from list a vector
        vector2.erase(vector2.end() - 1); // Erase escape character from end of word
        if(compareVectors(vector1, vector2, length)) { // compare the vectors
            cout << example << endl;
        }
        counter++;
    }

în

while (counter < 109582) {
        getline(wordList, example); // Get word, put it in example variable

        vector<char> vector2(stringToVector(example)); // Make word from list a vector
        vector2.erase(vector2.end() - 1); // Erase escape character from end of word
        if(compareVectors(vector1, vector2, length)) { // compare the vectors
            cout << example << endl;
        }
        counter++;
    }

Se pare că primeam un fel de eroare de depășire a limitei, încercând să citesc mai multe linii decât erau disponibile în fișier.

Comentarii

  • Problema a fost probabil că ați verificat doar dacă fișierul era deschis, nu și dacă era „ok” (adică nu a trecut de EOF și nu este rău). Ar fi trebuit să folosiți while (getline(wordList, example)). Încercați asta (3½ ani mai târziu, lol) –  > Por Curse de luminozitate pe orbită.

Tags:, ,