| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Нужно удалить значение в ассоциативном массиве |
| Автор: vovamakr 5.11.2015, 13:15 | ||
| Нужно удалить значение в ассоциативном массиве Я так реализовал:
но не знаю правильно ли это, так как не могу понять как в меине это все вывести( |
| Автор: xvr 5.11.2015, 15:15 |
| Ваш код делает непонятно что. Точнее понятно - что то удаляет, но явно не то, что хотелось. Подсказка - где у вас в удалении используется значение параметра key ? Ответ 'нигде' (как у вас и есть) явный признак неправильной реализации |
| Автор: vovamakr 5.11.2015, 15:23 | ||
xvr,
|
| Автор: math64 5.11.2015, 15:35 |
key здесь поле внутри записи, одноименное с параметром функции. Параметр функции же здесь снова не используется. |
| Автор: vovamakr 5.11.2015, 15:38 | ||
math64,
|
| Автор: math64 5.11.2015, 15:49 |
| Так ты не все элементы сдвигаешь. Хотя можно не сдвигать, а оставить дырку. Но тогда нужно различать size (чмсло ненулевый элементов) и reservedSize (число выделенных элементов в массиве). Да ещё нужно не забыть delete. Добавлено через 1 минуту и 20 секунд И еще: не array->entries[index]->key == key, а strcmp(array->entries[index]->key, key) == 0 Добавлено через 3 минуты и 4 секунды И копировать(если копировать) не только ключи, в всю запись - как было в первом варианте. |
| Автор: vovamakr 5.11.2015, 16:12 | ||
feodorv,
|
| Автор: feodorv 5.11.2015, 16:25 |
Уже радует. Но цикл в цикле не очень хорошо выглядит. А Вам точно нужно удалять все значения key из массива, или только первое встретившееся? Добавлено через 1 минуту и 22 секунды И, всё-таки, копируйте всю структуру))) |
| Автор: vovamakr 5.11.2015, 16:43 | ||||
feodorv,
Добавлено @ 16:44 feodorv, я не знаю как сделать что бы цикл не был в цикле
|
| Автор: feodorv 5.11.2015, 17:17 | ||
Если Вам нужно удалить из списка первый же элемент с ключом key, то это можно сделать так:
Если же Вам нужно удалить все записи с ключом key, то можно ввести два индекса, чтобы обойтись одним циклом, но я так и не понял, что Вам в точности нужно. |
| Автор: vovamakr 5.11.2015, 17:34 |
| feodorv, getValue()? int* GetValue(const AssociativeArray* array, const char* key) { for (unsigned index = 0; index < array->size; ++index) { AssociativeArray::Entry* entry = array->entries[index]; if (strcmp(entry->key, key) == 0) return entry->key; return nullptr; } |
| Автор: feodorv 5.11.2015, 18:30 | ||||
Да, забыл
А у Вас entry->value имеет тип (int *)??? Или это как дополнительный индикатор, найдена ли запись с данным ключом или нет? Тогда
|
| Автор: vovamakr 5.11.2015, 18:31 | ||||
feodorv,
Добавлено через 3 минуты и 50 секунд
|
| Автор: feodorv 5.11.2015, 18:47 | ||
vovamakr,
|
| Автор: math64 6.11.2015, 08:16 |
| vovamakr, а удалять entry и entry->key кто будет? Обычно в ассоциативных массивах не сдвигают записи при удалении, а оставляют дырки. Имеется size (число ненулевых записей) и reservedSize (число выделенных записей в массиве). size <= reservedSize. Добавлении нового элемента при равенстве reservedSize увеличивается. Если мы больше не планируем добавлять новых ключей, делается упаковка. При поиске, добавлении и удалении ключа сначала вычисляется кеш-код. Берется остаток от деления кэш-кода на reservedSize и получаем index, по которому предпочтительно разместить новый ключ. Если index занят другим ключом, проверяем index+1 и т. д. В неблагоприятном случае придется просмотреть весь массив, но чаще всего будем сразу попадать на нужную запись. |
| Автор: xvr 6.11.2015, 11:50 |
| Если порядок записей в ассоциативном массиве не важен (а это в большинтстве случаев так), то при удалении элемента можно просто менять местами последний элемент и удаляемый, а потом уменьшать на 1 счетчик активных элементов в массиве. Но в этом случае нужно 2 счетчика - размер массива и количество активных элементов (как уже советовал math64). |