Как я могу легко работать с символом **? - PullRequest
2 голосов
/ 25 марта 2009

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

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

Ответы [ 6 ]

5 голосов
/ 25 марта 2009

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

1 голос
/ 25 марта 2009

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

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

0 голосов
/ 25 марта 2009

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

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

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

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

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

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

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

0 голосов
/ 25 марта 2009

Если это просто ол 'C -

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

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

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

0 голосов
/ 25 марта 2009

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

...