2009-03-25 5 views
2

У меня есть char**, который мне часто нужно вставлять или выполнять поиск. Очень утомительно realloc(), malloc() массив и вставлять строки.Как я могу легко работать с char **?

Есть ли стандартный способ, которым я могу добавлять строки или выполнять поиск в char**? Наверное, я искал что-то вроде строки, но вместо этого использовал char**.

ответ

5

Если вы часто вставляете в эту структуру, вы не должны использовать char**; массив не является подходящей структурой данных для этих видов операций. Рассмотрим std::vector<string> или что-то подобное, если это возможно.

0

Неясно, какой вопрос вы пытаетесь задать. Если вам нужна последовательность строк, возможно, тип Seq_T от C Interfaces and Implementations от Dave Hanson выполнит трюк --- это коллекция очень полезных структур данных, написанных на C, и ему удается расти и сокращать память для вас, когда вы вставляете и удаляете Предметы.

1

Похоже, вы хотите использовать что-то вроде STL-списка или Boost Array char *.

Обратите внимание, что векторы STL не предпочтительнее, если вам нужно вставить или удалить элементы из массива.

0

Если это взбредет»C -

Я не видел никаких стандартных способов сделать это, но, как говорится, я делал это много в моих C процедурах. На самом деле довольно просто сделать ряд функций для выполнения манипуляций, которые вы хотите, для значений char * и char **.

Для меня это был вопрос построения (небольшой) библиотеки подпрограмм. Я начал с подпрограмм для управления памятью и всех операций char *, которые я хотел. Затем использовали те, которые выполняли процедуры для вставки в char ** и т. Д.

Для C++ вы должны рассмотреть возможность реорганизации для использования std :: vector или другой подобной структуры данных. Это будет намного приятнее.

+0

В простой C вы можете написать связанный список и использовать его. – Parappa

+0

Правда. Связанный список может быть полезным способом обработки этого. Однако при правильной процедуре просто установка указателя в новый массив по мере необходимости довольно быстро и просто. –

0

, если C++ вы можете использовать STL, но будьте осторожны, что поддержка кросс-платформы STL имеет значение iffy, что может не иметь значения для вас.

Если C, то вы, вероятно, захотите создать структуру данных для хранения всех ваших строк и создания вставки, удаления, изменения функций в этой структуре данных. вы должны найти множество открытых исходных кодов для структуры данных по вашему выбору.

В любом случае, чтобы выбрать подходящую структуру данных, вам необходимо рассмотреть ваши шаблоны поиска и вставки, как часто вы вставляете? как часто вы «смотрите»? это поиск вверх путем поиска подходящей строки или вы можете сделать что-то более интеллектуальное/быстрее? в основном требуется больше информации.

например, если строки уникальны, и вы имеете дело со множеством строк, имеет смысл рассчитать хэш строки и сохранить их в чем-то вроде дерева RB, связанного с этим хэшем. если вы никогда не получаете более 10 строк, это может не иметь смысла делать это, или, может быть, приложение таково, что вы можете просто назначить идентификатор строке и использовать индекс в качестве ключевого слова.

есть много вариантов.

0

Я согласен с (многие!) Другие, которые предположили, что другая структура данных, вероятно, лучше для этой ситуации, но если вы необходимо использовать char** по какой-то причине, обычная эвристика для

  1. поддерживать текущую длину и доступную длину в любое время (например, в struct), и
  2. всегда увеличивают размер буфера в два раза (или более) при realloc ing (что приводит к амортизированному времени O (n) для распределения и копирования).