Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
 как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
struct A{
  int age;
  bool empty;
};

vector<A> v = {{5},{6},{9}};

я смог придумать только флаг empty, чтобы по нему смотреть - пустая это ячейка или нет
а может можно как-то null воткнуть в позицию v[1]?

Сообщение было отредактировано: 5 апр 21, 06:17
5 апр 21, 06:20    [22304171]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Поскольку age обычно не бывает отрицательным - то можно договориться что если он равен -1 то это считается как null.
5 апр 21, 06:51    [22304174]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Бывает что доп поле как раз технически красивее.
Преждевременная оптимизация зло.
5 апр 21, 07:49    [22304189]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
Преждевременная оптимизация

ну это не она... Это проектирование архитектуры. Если её неправильно спроектировать, потом всё переделывать.
меня больше интересует, а есть ли вообще иной способ и на сколько этот прекрасен?

Сообщение было отредактировано: 5 апр 21, 09:31
5 апр 21, 09:36    [22304203]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
бабушкин зайчик

я смог придумать только флаг empty, чтобы по нему смотреть - пустая это ячейка или нет
а может можно как-то null воткнуть в позицию v[1]?

Попробуйте std::optional.
5 апр 21, 09:58    [22304212]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
бабушкин зайчик,

Если структуры большие, можно в векторе хранить std::unique_ptr<A> и вкорячивать nullptr.
5 апр 21, 10:00    [22304214]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Да. Я именно про архитектуру.
Она начинается с вопроса: "зачем хранить дырки в списке".
Но вы вправе не обсуждать. Ваше право.
5 апр 21, 10:36    [22304241]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
5 апр 21, 10:39    [22304242]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

Есть еще альтернативный подход. Называется вертикальные массивы.

Просто создаёшь два вектора.

vector<int> ages;
vector<boolean> isEmpty;


данные хранятся физически не консолидировано. Но логически - они связны по индексу элемента.

Эта структура будет экономнее чем вериант с struct A {..}
5 апр 21, 10:45    [22304250]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
неужели вектор не оптимизирован для этого? Дай цифры!
5 апр 21, 10:51    [22304254]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Да. Сам два вектора делал часто).
И еще есть 1500 вариантов оптимизации скорости в угоду.... жертвы
5 апр 21, 10:52    [22304256]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,

>на место удалённых
Странная фраз. Что ты назвал местом? Бери другой список без мест или с местами заранее. Сортированный или нет......
5 апр 21, 10:54    [22304260]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

Есть еще альтернативный подход. Называется вертикальные массивы.

Просто создаёшь два вектора.

vector<int> ages;
vector<boolean> isEmpty;


данные хранятся физически не консолидировано. Но логически - они связны по индексу элемента.

Эта структура будет экономнее чем вериант с struct A {..}

Это, наверное, хорошо только в случае необходимости очень серьёзной и очень специфической
оптимизации. Но до этого придётся отказаться от std::vector и переходить на Си.

В остальных случаях ваш вариант ужасен.
5 апр 21, 11:05    [22304265]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
да, кэш такое не одобрит
5 апр 21, 11:07    [22304267]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
5 апр 21, 11:08    [22304268]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Тест на цифры делать пол часа.
Иначе как ты докажешь что задание выполнено?))
5 апр 21, 11:11    [22304269]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
бабушкин зайчик
да, кэш такое не одобрит

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".
5 апр 21, 11:11    [22304271]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
счас же умные указатели. Где там они физически тебе недоступно. Не?
5 апр 21, 11:12    [22304273]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
У вас два слово "очень" и одно слово "ужасно". Это не инженерно)
5 апр 21, 11:14    [22304275]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Преждевременная оптимизация без целей и цифр. (((
5 апр 21, 11:15    [22304276]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
бабушкин зайчик
да, кэш такое не одобрит

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".

это вектор с дырками внутри, а не структура
5 апр 21, 11:17    [22304279]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
бабушкин зайчик
пропущено...

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
счас же умные указатели. Где там они физически тебе недоступно. Не?

не знаю. Вообще это что-то уже сродни листу... Там от балды ячейки в массив складываются, а не подряд.
В любом случае, МНЕ не подходит смещение индексов влево. Они должны оставаться теми же.
т.е. в ячейке 152 всегда должна быть та же самая структура с теми же самыми данными.

Сообщение было отредактировано: 5 апр 21, 11:13
5 апр 21, 11:19    [22304280]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
бабушкин зайчик
mayton
пропущено...

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".

это вектор с дырками внутри, а не структура

А какой длины будет твой вектор (в среднем) ?
5 апр 21, 11:25    [22304291]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,

>МНЕ не подходит смещение индексов влево
Сначала скорость мешала. Теперь направление)))
Короче, прогер сам себе задачи ставит. Бывает.
5 апр 21, 11:27    [22304293]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

mayton
А какой длины будет твой вектор (в среднем) ?

миллионы
так ещё и мультипоточность
нельзя ждать, пока он там раздуплится

Сообщение было отредактировано: 5 апр 21, 11:27
5 апр 21, 11:35    [22304298]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
Все форумы / C++ Ответить