Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / что не так с вектором делаю? / 25 сообщений из 56, страница 1 из 3
10.08.2019, 18:10
    #39847814
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
подозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь...
он тогда segfault выплёвывает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void func()
{
    for (int num : v2)
    {
        if (num >= 20   && num <= 100)
        {
            if (rand() % 2) {v1.push_back(0);}
            else            {v2.push_back(0);}
        }
    }
}


ф-я запускается в цикле конечно
когда в векторе набирается ~1 млн, то вылетает segfault
а вот при такой постановке оно едет дальше, но тормозит с каждой итерацией и на 150 лямах уже раз в 2 секунды итерирует
но это не важно
важно - segfault из-за чего?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    void func()
    {
        vector<int> vM, vF;

        for (int num : v2)
        {
            if (num >= 20   && num <= 100)
            {
                if (rand() % 2) {vM.push_back(0);}
                else            {vF.push_back(0);}
            }
        }

        v1.insert(end(v1), begin(vM), end(vM));
        v2.insert(end(v2), begin(vF), end(vF));
    }


т.е. я тут другой вектор создаю и оттуда добавляю в этот ПОСЛЕ итерации
...
Рейтинг: 0 / 0
10.08.2019, 18:39
    #39847821
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
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.
...
Рейтинг: 0 / 0
10.08.2019, 20:12
    #39847835
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
так это же означает, что вот там было 8 эл-тов, а когда вставляют 9й, то он переделывается на 16 эл-тов
потом на 32 и т.д.
...
Рейтинг: 0 / 0
11.08.2019, 00:48
    #39847873
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
Тут надо либо блокироваться либо версионироваться.
...
Рейтинг: 0 / 0
11.08.2019, 09:19
    #39847893
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
не понял?
...
Рейтинг: 0 / 0
11.08.2019, 09:58
    #39847896
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак это же означает, что вот там было 8 эл-тов, а когда вставляют 9й, то он переделывается на 16 эл-тов

Учти что 8 исчезает и появляется 16 новых, куда копируется исходные 8. А твой цикл упирается в 9-й несуществующий, который после 8-го исчезнувшего.

PS Поизучай что такое указатели. Явно их тут нет, но "под капотом" именно они.
...
Рейтинг: 0 / 0
11.08.2019, 10:09
    #39847898
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
так этим всем .push_back() занимается, где у меня цикл упирается?
...
Рейтинг: 0 / 0
11.08.2019, 10:19
    #39847899
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак этим всем .push_back() занимается, где у меня цикл упирается?
Да, v2.push_back(0)
...
Рейтинг: 0 / 0
11.08.2019, 11:44
    #39847906
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
так мы в итоге пришли к тому, что
авторподозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь...
?
...
Рейтинг: 0 / 0
11.08.2019, 14:17
    #39847919
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухне понял?
Обычно структуры данных (списки, деревья, хеш таблички) не любят модификаций.
Они перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь.

Поэтому итератор по старой структуре будет сломан.
И его надо заново пересоздать.

Коробочное решение этого вопроса - это версионные структуры данных. Или запрет на работу push или итератора взаимно. По сути блокировки.

И ещё.

С точки зрения бд в примере с массивом ты хочешь фантомного чтения. Не знаю хорошо это или плохо для твоей задачи. Но надо смотреть смыслы . Может тут не массив а очередь.
...
Рейтинг: 0 / 0
11.08.2019, 14:41
    #39847924
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак мы в итоге пришли к тому, что
авторподозреваю, что нельзя делать .push_back() тому же вектору, который итерируешь...
?Да, нельзя. А какое поведение вы ожидаете? По добавленным элементам цикл тоже должен пройти?
Вот в list например можно добавлять по ходу итерирования
...
Рейтинг: 0 / 0
11.08.2019, 15:11
    #39847931
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
так ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"
и замечу, что он таки растёт БЕЗ приключений до определённого момента
а потом падает
и вот причина падения конкретно в этом месте непонятна
память то ведь есть
maytonОни перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь.
таки не совсем... они же динамические
они выделяют память под определённое кол-во ячеек и ты можешь пихать в эти заготовленные ячейки новые значения
когда кол-во заканчивается, то выделяется ещё столько же (т.е. по окончании умножается на 2)
хотя конечно можно и железно прописать конкретное кол-во эл-тов, где чётко сказано, что больше не будет
но это не тот случай
...
Рейтинг: 0 / 0
11.08.2019, 15:52
    #39847938
blonduser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"


Можно, если к элементу вектора обращаться по индексу, а не через итератор.
...
Рейтинг: 0 / 0
11.08.2019, 16:01
    #39847941
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудух,

Для хеш-таблички это неверно. Да и нет у нее метода push_back.
...
Рейтинг: 0 / 0
11.08.2019, 16:36
    #39847951
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"
и замечу, что он таки растёт БЕЗ приключений до определённого момента
а потом падает
и вот причина падения конкретно в этом месте непонятна
Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть.
...
Рейтинг: 0 / 0
11.08.2019, 18:12
    #39847974
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
Dima Tполудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"
и замечу, что он таки растёт БЕЗ приключений до определённого момента
а потом падает
и вот причина падения конкретно в этом месте непонятна
Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть.
у меня 20 файлов с инфой про указатели, там есть всё что нужно
нечего сказать, вали мимо.
...
Рейтинг: 0 / 0
11.08.2019, 18:51
    #39847981
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"
и замечу, что он таки растёт БЕЗ приключений до определённого момента
а потом падает
и вот причина падения конкретно в этом месте непонятна
память то ведь есть
maytonОни перестраивают свою внутреннюю структуру когда ты что- то добавляешь или удаляешь.
таки не совсем... они же динамические
они выделяют память под определённое кол-во ячеек и ты можешь пихать в эти заготовленные ячейки новые значения
когда кол-во заканчивается, то выделяется ещё столько же (т.е. по окончании умножается на 2)
хотя конечно можно и железно прописать конкретное кол-во эл-тов, где чётко сказано, что больше не будет
но это не тот случайНу нельзя же увеличить ранее выделенный блок памяти. А вектор должен размещаться в непрерывном куске памяти. Так что выделяется новый блок большего размера, в него копируются значения из старого, и старый блок освобождается. А итератор продолжает указывать на освобожденный блок.
...
Рейтинг: 0 / 0
11.08.2019, 19:41
    #39848000
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
BarloneА итератор продолжает указывать на освобожденный блок.

Итератор - класс. Он не обязан инкапсулировать указатель, ему хватит и смещения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.08.2019, 19:47
    #39848001
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухDima Tпропущено...

Читай как устроены указатели и выделение памяти (new), тогда будет понятно. Тут никто не будет лекцию читать про базовые основы С++, для этого учебники есть.
у меня 20 файлов с инфой про указатели, там есть всё что нужно
нечего сказать, вали мимо.
Удачи в беге по граблям
...
Рейтинг: 0 / 0
11.08.2019, 20:12
    #39848006
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
maytonДля хеш-таблички это неверно
Не совсем: удали элемент, куда смотрит итератор и следующий будет неизвестен.
...
Рейтинг: 0 / 0
11.08.2019, 20:12
    #39848007
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
Dimitry SibiryakovBarloneА итератор продолжает указывать на освобожденный блок.

Итератор - класс. Он не обязан инкапсулировать указатель, ему хватит и смещения.
Не обязан конечно, но может. И во многих реализациях итератор по вектору - это именно указатель. Сказано же - при реаллокации итераторы инвалидируются.
...
Рейтинг: 0 / 0
11.08.2019, 20:41
    #39848016
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
Barloneполудухтак ведь вектор вроде задуман так, что в конец ему добавлять можно
безо всяких "перестроек"
и замечу, что он таки растёт БЕЗ приключений до определённого момента
а потом падает
и вот причина падения конкретно в этом месте непонятна
память то ведь есть
пропущено...

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

Dima Tполудуху меня 20 файлов с инфой про указатели, там есть всё что нужно
нечего сказать, вали мимо.
Удачи в беге по граблям
из тебя помощник, как из пятого колеса телега

по граблям я бегать люблю и практикую
потому что без грабель ты никогда не станешь специалистом
не собрав ВСЕ ошибки ты никогда не узнаешь, что тебя ждёт, если сделать это и то
это чуть ли не главная часть учебного процесса - грабли собирать
кроме того, когда ты сам спец, ошибок поубавится, но вот молодняк рядом может под шумок угробить и тебя заодно
так что грабли рулят
не надо меня ими пугать
я не раз проходил путь с полного нуля в теме до какого-никакого спеца и знаю, что такое учёба
меня жутко бодрит сам процесс обучения, я люблю грабли
а вот что меня раздражает, так это когда некий "гуру" пытается самоутвердиться за твой счёт.
про указатели 3.14здёж
нельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается
я читал про них всё и выжимка из доков составила аж 56 кб
так что не надо мне ля-ля. Нечего сказать пройди мимо.
...
Рейтинг: 0 / 0
11.08.2019, 20:53
    #39848018
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухDima Tпропущено...

Удачи в беге по граблям
из тебя помощник, как из пятого колеса телега

по граблям я бегать люблю и практикую
потому что без грабель ты никогда не станешь специалистом
не собрав ВСЕ ошибки ты никогда не узнаешь, что тебя ждёт, если сделать это и то
это чуть ли не главная часть учебного процесса - грабли собирать
кроме того, когда ты сам спец, ошибок поубавится, но вот молодняк рядом может под шумок угробить и тебя заодно
так что грабли рулят
не надо меня ими пугать
я не раз проходил путь с полного нуля в теме до какого-никакого спеца и знаю, что такое учёба
меня жутко бодрит сам процесс обучения, я люблю грабли
а вот что меня раздражает, так это когда некий "гуру" пытается самоутвердиться за твой счёт.
про указатели 3.14здёж
нельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается
я читал про них всё и выжимка из доков составила аж 56 кб
так что не надо мне ля-ля. Нечего сказать пройди мимо.
Эх, был бы ты подобрее, я бы тоже подобрее ответил. В конце концов у тебя проблема и ты не понимаешь как ее решать. С++ это не высокоуровневый ЯП, тут есть куча условностей, которые надо соблюдать, а откуда они взялись надо просто знать.

PS Рули граблями, одень каску чтоб не сильно било, искренние соболезнования твоему работодателю.
...
Рейтинг: 0 / 0
11.08.2019, 21:17
    #39848026
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудухнельзя разобраться в подобной ошибке просто узнав, что такое динамическая память и чем указатель от ссылки отличается
Это говорит о том что у тебя каша в голове.

Объясняю на примере: 8 орехов лежат в ячейках 260-267, в процессе пересчета добавили орех и т.к. ячейка 268 занята, то все орехи переложили в ячейки 100500-100508, дальше понятно?
...
Рейтинг: 0 / 0
11.08.2019, 21:32
    #39848028
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что не так с вектором делаю?
полудуха вот что меня раздражает, так это когда некий "гуру" пытается самоутвердиться за твой счёт.
Извиняюсь что пытался помочь, больше не буду.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / что не так с вектором делаю? / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]