Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Ошибка при использовании erase для std::vector

21.12.2016, 10:28. Показов 6094. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему в случае удаления элемента из вектора с помощью передачи итератора в erase, который соответствует позиции удаляемого элемента возникает ошибка(сегфолт)?
Но при этом с той же позиции итератора которая приводит к сегфолту при удалении, получается вывести значение
Т.е при очистки элемента получаем сегфолт, а при выводе значения адрес каким то образом оказывается валидным и значение выводится успешно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//g++  4.9.3
 
#include <iostream>
#include <vector>
 
int main()
{
    int index = 1000;
    int vectorSize = 5;
    
    std::vector<int> v(vectorSize);
    v[index] = 2;
 
    std::vector<int>::iterator nth = v.begin() + (vectorSize - 1);//ошибка при erase, если число которое прибавляется к begin больше количества элементов в векторе
    v.erase(nth);
 
    std::cout << *(v.begin()+index);//но при этом значение успешно выводится для адреса v.begin() + index т.е 1000
}
http://rextester.com/HLMWX81901 валидно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//g++  4.9.3
 
#include <iostream>
#include <vector>
 
int main()
{
    int index = 1000;
    int vectorSize = 5;
    
    std::vector<int> v(vectorSize);
    v[index] = 2;
 
    std::vector<int>::iterator nth = v.begin() + (index - 1);//ошибка при erase, если число которое прибавляется к begin больше количества элементов в векторе
    v.erase(nth);
 
    std::cout << *(v.begin()+index);//но при этом значение успешно выводится для адреса v.begin() + index т.е 1000
}
http://rextester.com/WEJQZS47437 сегфолт

Добавлено через 11 минут
Вот, может так будет нагляднее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//g++  4.9.3
 
#include <iostream>
#include <vector>
 
int main()
{
    int index = 1000;
    int vectorSize = 5;
    
    std::vector<int> v(vectorSize);
    v[index] = 2;
 
    std::vector<int>::iterator nth = v.begin() + index;//ошибка при erase, если число которое прибавляется к begin больше количества элементов в векторе -1
    //v.erase(nth); если убрать комментарий, будет сегфолт
 
    std::cout << *(nth);//но при этом значение успешно выводится для адреса v.begin() + index т.е 1000
}
http://rextester.com/DNZR40402

 Комментарий модератора 
Запрещено создавать темы в виде ссылок на задания или коды программ, расположенные на других сайтах.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2016, 10:28
Ответы с готовыми решениями:

std::vector::erase
Всем привет. Буду очень рад, если кто-нибудь может мне объяснить логику... см. скриншот....

Ошибка в функции erase для vector
cout &lt;&lt; &quot;How much numbers? : &quot;; int n; cin &gt;&gt; n; vector&lt;int&gt;array(n); for (int i = 0; i &lt; n; i++) { cin &gt;&gt; array; ...

Ошибка “vector<bool> erase iterator outside range” при работе алгоритма Хаффмана
Проблема с функцией BuildTable. Компилируется, но в процессе работы возникает ошибка. // Huffmann.cpp: определяет точку входа для...

55
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.12.2016, 10:42
Студворк — интернет-сервис помощи студентам
Не знаю, мне кажется, что при изучении программирования надо сначала язык освоить, потом проектирование, а уже потом постигать тонкости оптимизации.
Автор же пока язык не очень освоил, и от его темы попахивает дурно спроектированной программой, но с ним как с большим все о тонкостях оптимизации дискутируют!
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
23.12.2016, 10:58  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Не знаю, мне кажется, что при изучении программирования надо сначала язык освоить
Ну язык на базовом уровне я знаю (но пока не разбираюсь во всех тонкостях, это придет с опытом который я сейчас и пытаюсь прокачать)

Цитата Сообщение от Mr.X Посмотреть сообщение
и от его темы попахивает дурно спроектированной программой
Что конкретно дурного вы нашли в той реализации которая мне нужна?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.12.2016, 11:12
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну язык на базовом уровне я знаю
Не знаю что такое базовый уровень в вашем понимании, но знать С++ - это означает знать STL.
Поэтому человек, не умеющий обращаться со стандартными контейнерами, языка таки не знает.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Что конкретно дурного вы нашли в той реализации которая мне нужна?
Ну, человек, который умеет проектировать программы, задает вопросы четкие и всем понятные.
Мне же, например, после десятка выших сообщений не только не понятно что вам нужно, но с каждым вашим сообщением становится все непонятнее.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
23.12.2016, 11:21  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Не знаю что такое базовый уровень в вашем понимании, но знать С++ - это означает знать STL.
Хоть и не профи но не согласен. STL в C++ был не всегда. Значит до появления STL, люди не знали C++, хотя писали на нем?
Даже замечал что опытные программисты часто обходят STL стороной из за его неэффективности для их задач(в некоторых случаях)

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, человек, который умеет проектировать программы, задает вопросы четкие и всем понятные.
Ну вот DrOffset почему то понял
Может способ изложения вам не ясен
Но это вовсе не значит что данная реализация плохая
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.12.2016, 11:39
Цитата Сообщение от sys_beginner Посмотреть сообщение
Хоть и не профи но не согласен. STL в C++ был не всегда. Значит до появления STL, люди не знали C++, хотя писали на нем?
Ну, сейчас-то она есть, и основная часть языка таки в ней содержится!
Кстати, Степанов (создатель STL) считает, что главное в программе - это алгоритмы, а не данные, и он писал STL именно ради создания обобщенных алгоритмов. Поэтому знать STL, а следовательно C++, - это означает знать стандартные алгоритмы и уметь ими пользоваться. А то иногда забавно бывает видеть как человек, изучив только контейнеры, начинает их циклами мучить.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну вот DrOffset почему то понял
Не, ну есть телепаты тута, но я о своих личных ощущениях говорю. Мне вот кажется, что умение проектировать у вас пока не на высоте, а оно таки основное, и именно сюда вам стоило бы направить свои усилия.
Поэтому мне кажется, что ваш вопрос в теме логичнее было бы так сформулировать: мне в моем проекте привиделся вот такой жуткий контейнер. Помогите спроектировать по-человечески!
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
23.12.2016, 11:45  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, сейчас-то она есть, и основная часть языка таки в ней содержится!
К слову, у меня основная проблема с STL в контейнерах(а именно что у них под капотом). А так не мало оттуда знаю, работа с файлами например, алгоритмы типа unique, итераторы и т.д. Не на уровне профи конечно но более-менее ориентируюсь

Цитата Сообщение от Mr.X Посмотреть сообщение
Поэтому знать STL, а следовательно C++, - это означает знать стандартные алгоритмы и уметь ими пользоваться
Согласен. Но в данном случае контейнера под мои хотелки просто нет

Цитата Сообщение от Mr.X Посмотреть сообщение
Мне вот кажется, что умение проектировать у вас пока не на высоте
Не на высоте, но умею.
Просто не хочу флудить в теме дабы не отходить от основной проблемы
Но если детально опишу ситуацию где это нужно и попытаюсь объяснить по другому(что бы и вы поняли) необходимую реализацию думаю вы меня поймете и скорее всего согласитесь
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
23.12.2016, 15:29
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

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

Цитата Сообщение от sys_beginner Посмотреть сообщение
Но допустим в конкретном случае у меня будет 5 элементов в массиве с индексами 1000,2000,3000,4000,5000. Выходит из за 5 элементов мне нужно будет зарезервировать место для 5000 элементов что слишком много. А дальше если появится индекс с ещё большим числом, прибавить ещё места в массиве что бы сохранить этот индекс
Ну вот, наконец-то ты начал думать в том направлении, в котором нужно.
Сейчас ты потихонечку приходишь к мысли о взаимоисключающих параграфах. О том, что можно компенсировать скорость доступа через дополнительную память, или о том, что в условиях ограниченной памяти идеальную скорость доступа не всегда возможно обеспечить. Это как раз то, о чем я говорил, когда писал про "все бесплатно". В том смысле, что довольно часто нам приходится за что-то платить либо скоростью, либо памятью, либо и тем и другим, для достижения условно-идеального решения для нашей ситуации. А идеальное решение во всех отношениях возможно только в очень узких случаях, да и то не всегда.
Поэтому лично мне представляется, что в условиях фиксированной памяти для общего случая будет сложно обеспечить скорость поиска лучшую, чем O(log(N)), что в большинстве случаев довольно неплохо. Все более скоростные решения требуют дополнительных затрат на выделение памяти. Кстати вот есть такая иллюстрация к совету 23 из книги Мейерса, это к вопросу о сортированных векторах.

И все-таки, ругать тебя за бег впереди паровоза я, конечно, не буду, но хочу донести одну мысль еще раз: чтобы сделать хорошее решение, которое будет близко к идеальному, нужно представлять спектр возможных подходов к решению задачи. В "скучных" книгах по алгоритмам дается эта база. Я не очень представляю как можно писать реализацию хеш-таблицы, или сколь-нибудь эффективную реализацию аллокатора без этих знаний. Начни читать хотя бы Седжвика, он гораздо легче дается, и код предполагается на С++. Без алгоритмической базы ничего хорошего реализовать у тебя, к сожалению, не получится.
6
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
23.12.2016, 17:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Сейчас ты потихонечку приходишь к мысли о взаимоисключающих параграфах. О том, что можно компенсировать скорость доступа через дополнительную память, или о том, что в условиях ограниченной памяти идеальную скорость доступа не всегда возможно обеспечить.
Ага. Я думаю проще просто зарезервировать больше памяти(такая возможность есть) в пользу скорости т.к по моим наблюдениям в этом случае серебрянной пули нет и придется жертвовать памятью так как скорость приоритетнее.
И реализация будет проще, можно тупо создать массив нужного типа с заведомо большим размером. А дальше насколько я понимаю что бы добраться до нужного индекса потребуется время на "указатель на начало массива + индекс" - это вроде константная сложность

Цитата Сообщение от DrOffset Посмотреть сообщение
Без алгоритмической базы ничего хорошего реализовать у тебя, к сожалению, не получится.
Согласен. Чем больше знаешь тем лучше можешь что то сделать. Скачал книгу уже по STL, Nicolai M. JOSUTTIS её хвалят тем что STL хорошо разбирается в этой книге.
Но все же мне лично материал легче дается из обсуждений нежели из чтения простыни текста Но все же стараюсь читать книги... Хотя в последнее время мало. Читал как то Страуструпа... надолго запомнил

Добавлено через 10 секунд
Спасибо!

Добавлено через 5 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
Читал как то Страуструпа... надолго запомнил
Видимо он травмировал мою психику в отношении чтения книг ))
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.12.2016, 18:36
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Цитата Сообщение от sys_beginner Посмотреть сообщение
К слову, у меня основная проблема с STL в контейнерах
2
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.12.2016, 18:46
Конечно, стоит рассматривать эту схему лишь как приближенную шпаргалку.
Например - хранить строки лучше в map, нежели unordered_map т.к. для хеш-функции понадобится пройтись по всей строке, в то время, как бинарное дерево может определить место элемента, не проходя до конца, используя лексикографическое сравнение.

Чтобы лучше понять контейнеры - нужно прочитать теорию и подкрепить это хорошей практикой. Идеально было бы попытаться реализовать их, хотя бы на примитивном уровне, но с соблюдением требований O-нотации на добавление/поиск/удаление.

Добавлено через 2 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Nicolai M. JOSUTTIS
Согласен, хорошая книга. Я STL именно по ней учил. Только берите второе издание, там дополнения для С++11.
Советую потом ещё Майерса, Эффективное использование STL.
1
23.12.2016, 19:26

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
чтобы изменить
Цитата Сообщение от DrOffset Посмотреть сообщение
чтобы все
Цитата Сообщение от DrOffset Посмотреть сообщение
чтобы сделать
Цитата Сообщение от sys_beginner Посмотреть сообщение
что бы и вы
Цитата Сообщение от DrOffset Посмотреть сообщение
Ссылку я тебе дал, что бы ты прочитал
:D Тенденция однако! Так кто тут на кого влияет?

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.12.2016, 00:11  [ТС]
MrGluck,
Отличная картинка! Большое спасибо! А то держать этот кошмар в голове это...

Цитата Сообщение от MrGluck Посмотреть сообщение
Только берите второе издание, там дополнения для С++11
У меня именно второе издание

Mr.X,
Никто ни на кого не влияет. Тут просто обсуждения. Вопросы, ответы и советы. Зачем такое писать? Вам жалко что ли когда мне помогают? От вас же ничего не уходит

Добавлено через 10 минут
Форум на то и форум
Книге и статье вопросы не задашь и ничего с ними не обсудишь
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.12.2016, 10:25
Цитата Сообщение от sys_beginner Посмотреть сообщение
Никто ни на кого не влияет. Тут просто обсуждения. Вопросы, ответы и советы. Зачем такое писать? Вам жалко что ли когда мне помогают? От вас же ничего не уходит
Ну, это таки юмор был, и исключительно по поводу правописания слова "чтобы". Хотелось бы, чтобы в процессе этой помощи вы становились грамотнее, а тут как-то наоборот получилось!
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.12.2016, 10:29
 Комментарий модератора 
Беседа по поводу правописания вынесена в отдельную тему.

.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.12.2016, 00:51
Вот ещё картинка по алгоритмам
Форум пережал png в jpg
Эта же картинка в формате png на Я.диске
Миниатюры
Ошибка при использовании erase для std::vector  
4
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.12.2016, 20:40  [ТС]
MrGluck,
Супер! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2016, 20:40

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Ошибка "Segmentation fault" при вызове метода erase() контейнера vector
Хочу убрать изолированные вершины в графе. На строке 75 выдает &quot;Segmentation fault&quot;. #include &lt;iostream&gt; #include...

Ошибка с vector.erase
Выдает ошибку vector erase iterator outside range на моменте вывода нового вектора. #include &lt;iostream&gt; #include &lt;string&gt; ...

Ошибка при использовании vector<bool>
Текст ошибки (Visual studio 2013): Ошибка 2 error C2440: return: невозможно преобразовать...

Ошибка: Out of range при использовании <vector>
void quicksort() { long long arrsize; cout &lt;&lt; &quot;Enter amount of number&gt; &quot;; cin &gt;&gt; arrsize; vector&lt;long long&gt; arr(arrsize); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru