2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
||||||
1 | ||||||
Expression: vector subscript out of range30.07.2019, 16:45. Показов 5040. Ответов 17
Метки нет (Все метки)
Дано задание:
Напишите функцию, которая: - называется PalindromFilter - возвращает vector<string> - принимает vector<string> words и int minLength и возвращает все строки из вектора words, которые являются палиндромами и имеют длину не меньше minLength Входной вектор содержит не более 100 строк, длина каждой строки не больше 100 символов. Примеры words minLength результат abacaba, aba 5 abacaba abacaba, aba 2 abacaba, aba weew, bro, code 4 weew Я написал такое:
https://pp.userapi.com/c850528... uartJg.jpg Ну и код вроде работает верно: https://sun9-23.userapi.com/c8... pbB3uA.jpg Подскажите из-за чего? p.s. а как изображения вставлять?
0
|
30.07.2019, 16:45 | |
Ответы с готовыми решениями:
17
Struct / Vector / Expression: vector subscript out of range Expression:vector subscript out of range expression vector subscript out of range Expression: string subscript out of range |
30.07.2019, 17:03 | 3 | |||||
жми повтор, потом посмотри в окно Call Stack, там все функции в порядке углубления в вызовы.
Щёлкни последнюю не библиотечную, а свою человеческую функцию из списка. Наведи мышкой на все переменные какие могут вызывать ошибку и проверь их состояние. Добавлено через 2 минуты
1
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
||||||
30.07.2019, 17:20 | 4 | |||||
Сообщение было отмечено MungenHara как решение
Решение
Выход за пределы вектора, может возникнут, когда обращаетесь через индекс к какому-то елементу, которого ещё нет, даже если вы хотите его определить, могут быть и другие причины.
Недавно вам писал вариант определения палиндромов, только переделать под множество строк: Вот, пока моя реализация, сейчас гляну ваш код:
2
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
|
30.07.2019, 17:24 | 5 |
1
|
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
|
||||||
30.07.2019, 20:16 | 6 | |||||
MungenHara, Вам же объясняли в теме
Не могу понять почему код не работает и кстати не только я, как определить является строка палиндромом или нет, а Вы опять пишите неправильно. Какой смысл что-то объяснять дальше ? Вы наверное сам принцип как определяется является строка палиндромом или нет, не можете понять. берём первый и последний элемент. сравниваем их if(s[0]!=s[n-1]) возможны 2 случая: 1) они не равны (условие в if истина) функции возвращает результат: return false и завершает работу. 2) они равны (условие в if ложь) тогда следующая итерация цикла - берём второй и предпоследний элемент. сравниваем их if(s[1]!=s[n-2]). возможны 2 случая: 1) они не равны (условие в if истина) функции возвращает результат: return false и завершает работу. 2) они равны (условие в if ложь) тогда следующая итерация цикла - берём третий и предпредпоследний элемент. сравниваем их if(s[2]!=s[n-3]). и так далее: берём i-ый и зеркальный ему относительно середины массива элемент с индексом n-1-i. сравниваем их if(s[i]!=s[n-1-i]). если элементы, про которые речь шла выше, совпадают i меняется от 0 до середины массива, т.е от 0 до n/2-1. в этом случае возвращается true (строка является палиндромом). надеюсь более чем ясно. описанное выше в виде функции будет так:
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
|
31.07.2019, 19:08 [ТС] | 7 |
Да я попробовал наоборот специально сделать и посмотреть сработает ли. Показалось, что сработало. Но я выбрал не лучший пример для проверки.
Да, действительно. Итерация кончается на 1ой итерации. И я только сейчас понял как последовательность. То есть я правильно понимаю, что в конце bool функции всегда должна стоять return true? Я неверно полагал, что исполнится весь цикл, даже если посажу return true в if. Но теперь я понял своё заблуждение и к сожалению не первое. До этого я считал, что результаты цикла остаются внутри цикла и изначальные значения не будут изменены. Но был не прав. Большое спасибо! Нашёл. Буду разбираться. Благодарю! Ах ты ж ёлки. Я три раза инициировал повторно words, minLenght и PalindromFilter. Удивительно как код вообще запустился а отладчик не ругался. Вот не могу понять. Смотрю и кажется, что ваш и мой код ничем принципиально не отличаются, но у вас выходит без ошибок, когда как у меня это проблема не решилась) Пока, к сожалению мне этот код не понятен. Другой способ пробовал и отладчик ругался. В итоге плюнул и решил остановиться на имеющихся заданиях. И спасибо за предоставленный код!
0
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
||||||
31.07.2019, 19:20 | 8 | |||||
Другой способ не проверял особо, но должен работать. А первый основан на потоках string:
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
|
31.07.2019, 19:22 [ТС] | 9 |
Я попробовал как вы сделать и всё равно выходила ошибка.
В итоге прогнал через for(auto string :PalindromFilter) и вышло без этой ошибки 1733. Но вот к сожалению так и не понял на что конкретно там ругались.
0
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
||||||
31.07.2019, 19:25 | 10 | |||||
Правильный второй способ:
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
|
31.07.2019, 19:28 [ТС] | 11 |
Да это я где-то наверняка накосячил там.
Благодарю! Разберу ваш код и комментарии завтра поподробнее. А то я долго ломал голову как бы ввести строки, но в итоге выяснил что это совсем не обязательно и плюнул на это дело. Добавлено через 1 минуту Я во уже не вспомню, что я конкретно там нагородил. Но разве push_back не должен стоять после getline?
0
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
|
31.07.2019, 19:36 | 12 |
Пожалуйста.
Как уже вам ранее говорили, нельзя возвращать true и утверждать, что слово палиндром при первом совпадении, потому как далее могут быть уже не равные буквы. Напротив, при первом же несовпадении нужно возвращать false, иначе в самом конце функции возвращаем true. Добавлено через 3 минуты Не принципиально, так как перед входом в цикл while уже есть getline, далее while проверяет не равен ли он "0" и добавляет в вектор. Далее пользователь вводит ещё раз и while снова проверяет. Так сделано, чтобы последный ввод (а он будет "0") не попал в вектор, потому как такой ввод не нужен и является только индикатором того, что пользователь завершил ввод слов. Добавлено через 1 минуту Я неправильно первый раз подал код. Второй раз уже будет работать.
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
||||||
31.07.2019, 19:48 [ТС] | 13 | |||||
Прошу прощения, я имел ввиду мой исправленный код. Я уже понял свою ошибку. Я несколько не понимал как работает последовательность действий и оттого совершил такую ошибку.
Спасибо, учту! Да нет, я имел ввиду, что я сам примерно такой код вводил до этого и отладчик ругался. А потом я просто бросил это дело, так как мне сказали, что вводить слова в принципе в этом задании и не надо.
0
|
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
|
||||||
31.07.2019, 19:57 | 14 | |||||
Старайтесь проверить как можно более вариантов, какие только в голову не придут, это и будет тестирование.
Потом уже решаете, нужно, чтобы так работало или нет. Добавлено через 3 минуты Здесь как раз нужна просто длинна, так как проверяете вы через "<", а не "<=". Да и не обязательно новую переменную b вводить, например:
1
|
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
|
|
01.08.2019, 00:23 | 15 |
в общем случае (для других задач) это не так. но для этой задачи что нужно вывести, если не одна проверка в цикле не сработала и false не возвратилось ? - т.е. ВСЕ элементы оказались зеркально симметричными - правильно - сказать что это палиндром, поэтому после цикла и пишем return true;
не совсем понятно, о чём это Вы. функция завершает работу сразу после возврата значения (как только выполнился return). вводить с клавиатуры не обязательно, потому что есть вектор с входными данными: но в тоже время никто не запрещает заполнить этот вектор с клавиатуры или ещё каким то способом - это уже на Ваше усмотрение.
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
||||||
01.08.2019, 14:16 [ТС] | 16 | |||||
Ох ты ж. Моё упущение. Даже и не заметил эту ошибку.
Ну а b я ввёл для собственного удобства. Я понимаю о чём вы. Я тут недавно думал, что если например взять for:
0 1 2 3 4 5 // внутри цикла 0 // за пределами цикла, a принимает снова изначальное значение На тот момент у меня уже не было моральных сил, я просто снёс код и начал заново но уже с изначально заданным вектором. Всему своё время, так сказать подумал я. Надо было хотя бы заданное задание решить сперва.
0
|
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
|
|||||||||||
02.08.2019, 11:43 | 17 | ||||||||||
только минусы от этого - код становится менее читабельным. дополнительные переменные логично вводить там, где это оправдано, например вместо:
1
|
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
|
|
04.08.2019, 10:00 [ТС] | 18 |
Спасибо, принял к сведению.
Ну, это была уверенность на грани непоколебимости. Позже же конечно мне встретился пример, где эта непоколебимость попала под сомнение.
0
|
04.08.2019, 10:00 | |
04.08.2019, 10:00 | |
Помогаю со студенческими работами здесь
18
Ошибка Expression: string subscript out of range Ошибка expression string subscript out of range Vector subscript out of range Vector subscript out of range Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |