|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
подозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь... он тогда segfault выплёвывает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
ф-я запускается в цикле конечно когда в векторе набирается ~1 млн, то вылетает segfault а вот при такой постановке оно едет дальше, но тормозит с каждой итерацией и на 150 лямах уже раз в 2 секунды итерирует но это не важно важно - segfault из-за чего? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
т.е. я тут другой вектор создаю и оттуда добавляю в этот ПОСЛЕ итерации ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2019, 18:10 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
https://en.cppreference.com/w/cpp/container/vector/push_back If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2019, 18:39 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
так это же означает, что вот там было 8 эл-тов, а когда вставляют 9й, то он переделывается на 16 эл-тов потом на 32 и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2019, 20:12 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
Тут надо либо блокироваться либо версионироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 00:48 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
не понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 09:19 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак это же означает, что вот там было 8 эл-тов, а когда вставляют 9й, то он переделывается на 16 эл-тов Учти что 8 исчезает и появляется 16 новых, куда копируется исходные 8. А твой цикл упирается в 9-й несуществующий, который после 8-го исчезнувшего. PS Поизучай что такое указатели. Явно их тут нет, но "под капотом" именно они. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 09:58 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
так этим всем .push_back() занимается, где у меня цикл упирается? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 10:09 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак этим всем .push_back() занимается, где у меня цикл упирается? Да, v2.push_back(0) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 10:19 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
так мы в итоге пришли к тому, что авторподозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь... ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 11:44 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухне понял? Обычно структуры данных (списки, деревья, хеш таблички) не любят модификаций. Они перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь. Поэтому итератор по старой структуре будет сломан. И его надо заново пересоздать. Коробочное решение этого вопроса - это версионные структуры данных. Или запрет на работу push или итератора взаимно. По сути блокировки. И ещё. С точки зрения бд в примере с массивом ты хочешь фантомного чтения. Не знаю хорошо это или плохо для твоей задачи. Но надо смотреть смыслы . Может тут не массив а очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 14:17 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак мы в итоге пришли к тому, что авторподозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь... ?Да, нельзя. А какое поведение вы ожидаете? По добавленным элементам цикл тоже должен пройти? Вот в list например можно добавлять по ходу итерирования ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 14:41 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
так ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" и замечу, что он таки растёт БЕЗ приключений до определённого момента а потом падает и вот причина падения конкретно в этом месте непонятна память то ведь есть maytonОни перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь. таки не совсем... они же динамические они выделяют память под определённое кол-во ячеек и ты можешь пихать в эти заготовленные ячейки новые значения когда кол-во заканчивается, то выделяется ещё столько же (т.е. по окончании умножается на 2) хотя конечно можно и железно прописать конкретное кол-во эл-тов, где чётко сказано, что больше не будет но это не тот случай ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 15:11 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" Можно, если к элементу вектора обращаться по индексу, а не через итератор. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 15:52 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудух, Для хеш-таблички это неверно. Да и нет у нее метода push_back. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 16:01 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" и замечу, что он таки растёт БЕЗ приключений до определённого момента а потом падает и вот причина падения конкретно в этом месте непонятна Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 16:36 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
Dima Tполудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" и замечу, что он таки растёт БЕЗ приключений до определённого момента а потом падает и вот причина падения конкретно в этом месте непонятна Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть. у меня 20 файлов с инфой про указатели, там есть всё что нужно нечего сказать, вали мимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 18:12 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" и замечу, что он таки растёт БЕЗ приключений до определённого момента а потом падает и вот причина падения конкретно в этом месте непонятна память то ведь есть maytonОни перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь. таки не совсем... они же динамические они выделяют память под определённое кол-во ячеек и ты можешь пихать в эти заготовленные ячейки новые значения когда кол-во заканчивается, то выделяется ещё столько же (т.е. по окончании умножается на 2) хотя конечно можно и железно прописать конкретное кол-во эл-тов, где чётко сказано, что больше не будет но это не тот случайНу нельзя же увеличить ранее выделенный блок памяти. А вектор должен размещаться в непрерывном куске памяти. Так что выделяется новый блок большего размера, в него копируются значения из старого, и старый блок освобождается. А итератор продолжает указывать на освобожденный блок. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 18:51 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
BarloneА итератор продолжает указывать на освобожденный блок. Итератор - класс. Он не обязан инкапсулировать указатель, ему хватит и смещения. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 19:41 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухDima Tпропущено... Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть. у меня 20 файлов с инфой про указатели, там есть всё что нужно нечего сказать, вали мимо. Удачи в беге по граблям ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 19:47 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
maytonДля хеш-таблички это неверно Не совсем: удали элемент, куда смотрит итератор и следующий будет неизвестен. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 20:12 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovBarloneА итератор продолжает указывать на освобожденный блок. Итератор - класс. Он не обязан инкапсулировать указатель, ему хватит и смещения. Не обязан конечно, но может. И во многих реализациях итератор по вектору - это именно указатель. Сказано же - при реаллокации итераторы инвалидируются. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 20:12 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
Barloneполудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно безо всяких "перестроек" и замечу, что он таки растёт БЕЗ приключений до определённого момента а потом падает и вот причина падения конкретно в этом месте непонятна память то ведь есть пропущено... таки не совсем... они же динамические они выделяют память под определённое кол-во ячеек и ты можешь пихать в эти заготовленные ячейки новые значения когда кол-во заканчивается, то выделяется ещё столько же (т.е. по окончании умножается на 2) хотя конечно можно и железно прописать конкретное кол-во эл-тов, где чётко сказано, что больше не будет но это не тот случайНу нельзя же увеличить ранее выделенный блок памяти. А вектор должен размещаться в непрерывном куске памяти. Так что выделяется новый блок большего размера, в него копируются значения из старого, и старый блок освобождается. А итератор продолжает указывать на освобожденный блок. ну если бы в этом была проблема, он бы сразу упал, не? Dima Tполудуху меня 20 файлов с инфой про указатели, там есть всё что нужно нечего сказать, вали мимо. Удачи в беге по граблям из тебя помощник, как из пятого колеса телега по граблям я бегать люблю и практикую потому что без грабель ты никогда не станешь специалистом не собрав ВСЕ ошибки ты никогда не узнаешь, что тебя ждёт, если сделать это и то это чуть ли не главная часть учебного процесса - грабли собирать кроме того, когда ты сам спец, ошибок поубавится, но вот молодняк рядом может под шумок угробить и тебя заодно так что грабли рулят не надо меня ими пугать я не раз проходил путь с полного нуля в теме до какого-никакого спеца и знаю, что такое учёба меня жутко бодрит сам процесс обучения, я люблю грабли а вот что меня раздражает, так это когда некий "гуру" пытается самоутвердиться за твой счёт. про указатели 3.14здёж нельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается я читал про них всё и выжимка из доков составила аж 56 кб так что не надо мне ля-ля. Нечего сказать пройди мимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 20:41 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухDima Tпропущено... Удачи в беге по граблям из тебя помощник, как из пятого колеса телега по граблям я бегать люблю и практикую потому что без грабель ты никогда не станешь специалистом не собрав ВСЕ ошибки ты никогда не узнаешь, что тебя ждёт, если сделать это и то это чуть ли не главная часть учебного процесса - грабли собирать кроме того, когда ты сам спец, ошибок поубавится, но вот молодняк рядом может под шумок угробить и тебя заодно так что грабли рулят не надо меня ими пугать я не раз проходил путь с полного нуля в теме до какого-никакого спеца и знаю, что такое учёба меня жутко бодрит сам процесс обучения, я люблю грабли а вот что меня раздражает, так это когда некий "гуру" пытается самоутвердиться за твой счёт. про указатели 3.14здёж нельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается я читал про них всё и выжимка из доков составила аж 56 кб так что не надо мне ля-ля. Нечего сказать пройди мимо. Эх, был бы ты подобрее, я бы тоже подобрее ответил. В конце концов у тебя проблема и ты не понимаешь как ее решать. С++ это не высокоуровневый ЯП, тут есть куча условностей, которые надо соблюдать, а откуда они взялись надо просто знать. PS Рули граблями, одень каску чтоб не сильно било, искренние соболезнования твоему работодателю. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 20:53 |
|
что не так с вектором делаю?
|
|||
---|---|---|---|
#18+
полудухнельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается Это говорит о том что у тебя каша в голове. Объясняю на примере: 8 орехов лежат в ячейках 260-267, в процессе пересчета добавили орех и т.к. ячейка 268 занята, то все орехи переложили в ячейки 100500-100508, дальше понятно? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2019, 21:17 |
|
|
start [/forum/topic.php?fid=57&msg=39847924&tid=2017583]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 165ms |
0 / 0 |