![]() |
![]() |
mae 27.04.2004 - 06:25 |
Понадобилось удалить элемент массива. Причём так, чтобы нумерация элементов сдвинулась, а размер массива уменьшился. В типизированных языках такое является извратом, но тем не менее, можно ли как-то сделать это в с++? |
Doid 1 - 27.04.2004 - 08:31 | (0) А если попробовать в качестве массива использовать std::vector? |
Интернетчик хренов 2 - 27.04.2004 - 10:01 |
>Doid А в vector индексирование по порядковому номеру в списке осуществляется ? Как же я такой момент упустил :)))... |
VaS 3 - 27.04.2004 - 10:06 |
//массив из 5 элементов int *a = (int*)malloc(5 * sizeof(int)); ... //сдвинем кусок массива от 4 элемента до конца на 1 Move(&a[3], &a[2], 2 * sizeof(int)); //освободим лишнюю память в хвосте realloc(a, 4 * sizeof(int)); free(a); |
Doid 4 - 27.04.2004 - 10:39 |
(2) Осуществляется вообще-то :). При удалении элемента элементы после этого элемента сдвигаются влево. P.S. Если массив - большой, то лучше использовать по возможности std::list, так как возможна потеря производительности из-за постоянного переноса хвоста массива при удалении элемента. |
Doid 5 - 27.04.2004 - 10:47 | (+4) Тока в list нету индексирования. |
UE 6 - 27.04.2004 - 11:06 | хе-хе... а как вам std::map<std::int, некий_тип> ? ;) |
mae 7 - 27.04.2004 - 11:14 |
3, на счёт realloc я не уверен. Дело в том, что у меня массив структур. В сторуктуре два элемента - указатель на AnsiString и bool. Память для массива я выделяю оператором new. То есть realloc тут не подойдёт. |
Интернетчик хренов 8 - 27.04.2004 - 11:24 | UE - в map вообще - то ключи придётся вручную менять ;) |
Тигренок 9 - 27.04.2004 - 12:12 |
создаешь новый массив размера n-1, копируешь туда все элементы кроме удаленного, старый удаляешь. std::vector, кажется, так и делает при выполнении erase. но если часто выполняется вставка/удаление, может быть, написать свой класс, который при необходимости увеличивает память скажем на current_count*2 элементов, но не освобождает при удалении элемента (просто сдвигает текущие)? тогда через небольшое время не нужно будет все время вызывать new/delete[], правда, за счет некоторого лишнего неиспользуемого объема. |
Сергей 10 - 27.04.2004 - 12:40 | Если мне не изменяет память, при удалении элементов vector тоже не освобождает память. Ну а если же есть подозрение, что буду производиться частые вставки элементов в vector, можно зарезервировать ее побольше изначально при помощи vector::reserve. |
steppler 11 - 27.04.2004 - 12:46 | "из-за постоянного переноса хвоста массива при удалении элемента." А с чего ты взял, что там перенос происходит? Ты знаешь алгоритм работы std::vector? |
steppler 12 - 27.04.2004 - 12:48 | вопрос был к [4] |
Тигренок 13 - 27.04.2004 - 12:55 | [10] действительно, не освобождает. деструктор элемента вызывает, но память освобождает только по требованию. |
Doid 14 - 27.04.2004 - 13:19 | (11) Не так давно читал книгу Кёнига. Вот там и был упомянут данный факт. |
steppler 15 - 27.04.2004 - 13:31 | Да, я и сам уже прочитал: "vector<T, Allocator> is a type of sequence that supports random access iterators. It supports amortized constant time insert and erase operations at the end. Insert and erase in the middle take linear time." Судя по времени, наверно так и происходит... |
Сергей 16 - 27.04.2004 - 14:52 | Описанный эффект подробно рассматривается у Скотта Мейерса в "Эффективном использовании STL". |
VaS 17 - 27.04.2004 - 15:05 | 7: Ну так выделяй память malloc()-ом и освобождай строку из структуры перед сжатием массива. Все это, естесственно, если тебе необходимо использовать именно массив. Если же нет - vector и иже с ним. |
dvserg 18 - 27.04.2004 - 17:24 |
В Билдере есть класс TList Посмотри его |
mae 19 - 28.04.2004 - 05:57 |
17, да, я теперь malloc-ом выделаю память. Но после функции Move порой выдаётся исключение при обращении к любому элементу массива. МОжет это из-за того, что я строку из структуры не освобождаю? Она ведь по-моему является указателем, и размер имееет фиксированый. Или не так? |
mae 20 - 28.04.2004 - 05:59 | А где можно про vector почитать? |
steppler 21 - 28.04.2004 - 11:05 | Леен Аммерааль, "STL для программистов на C++".(Жаль в продаже уже нет, отличная ,была книга) |
mae 22 - 29.04.2004 - 12:01 | Спасибо VaS, всё работает. Тема закрыта |
steppler 23 - 30.04.2004 - 10:04 | Работает то работает, но STL для того и придумана, чтобы не изобретать велосипеды. Хотя пару раз пощупать своими руками тоже полезно. |