В настоящее время я использую g ++ на терминале Cygwin согласно запросу моего профессора.
Я должен взять входной файл и прочитать его слово за словом, а затем поместить все слова в вектор, отсортировано по алфавиту и без дубликатов.
Однако каждый раз, когда я пытаюсь манипулировать моим вектором (т.е. push_back) внутри определенных циклов , моя программа просто вызывает ошибки сегментации.
Вот фрагмент моего кода:
void word_count(ifstream& input){
string temp;
vector<string> v;
input >> temp; //set first variable
v.push_back(temp);
while (!input.eof()) { //I'm aware of the limitations while using !eof, this is just the way I am required to loop over a file
input >> temp;
for (vector<string>::iterator i = v.begin(); i != v.end(); i++) { //check entire vector for word
if (*i == temp) { //just break and skip the word if it already exists
break;
}
if (i == v.end() - 1) { //if the word doesn't exist yet
for (vector<string>::iterator k = v.begin(); k != v.end(); k++) { //re-search the vector for the proper place
if (k == v.end() - 1) { //if at the end, just push_back the vector
v.push_back(temp); //Causes segmentation fault
break;
}
if ((*k < temp) && (*(k + 1) > temp)) { //find correct place and insert the word in the vector
v.insert(k, temp); //Also causes segmentation fault if execution even manages to get this far
}
}
}
}
}
}
Первый push_back в строке 5 отлично работает, я могу скопировать и вставить это несколько раз без ошибок. Я также могу нажать push_back сразу после ввода >> temp (внутри while l oop) без ошибок. Однако, если я попытаюсь нажать push_back под 'k' l oop, то произойдет сбой сегментации. Я в полном замешательстве.
Я пытался посмотреть на другие вопросы, связанные с вектором, здесь, в StackOverflow, но я не совсем понимаю, почему я могу (или не могу) использовать push_back в определенных местах.
Спасибо за любую помощь заранее!
Редактировать 1: Я должен упомянуть, что я протестировал его в VS 2019. Файл векторной библиотеки выскочил, сообщив, что было сгенерировано исключение «нарушение прав чтения-доступа». Нет ошибок сегментации (или, может быть, так VS сообщает, что произошла ошибка сегментации?)
Редактировать 2: Изменение вектора делает недействительными итераторы. Я не знал этого, спасибо всем за помощь!
Редактировать 3: Мне разрешено использовать только векторы, а не наборы или другие контейнеры. Если бы я мог использовать набор, я бы полностью.