#c #multidimensional-array
#c #многомерный массив
Вопрос:
Мне нужно закодировать программу, которая вставляет / удаляет строки из 2d-массива и способна выполнять инструкции отмены / повтора как можно быстрее. Я думал о создании 2d-массива для каждой инструкции вставки / удаления, поэтому отмена в основном копирует старый 2d-массив в текущий.
Например, мой текущий 2d-массив:
«1: Привет
2: Мир»
Затем я прошу удалить строку # 2, так что теперь мой текущий 2d-массив: «1: Привет»
, и я хочу создать новый 2d-массив, который содержит:
«1: Привет
2: Мир»
, чтобы, если я попрошу отменить, он копировал обратно «1: Привет 2: Мир» в текущий 2d-массив.
struct node{char** Instruction2dArray;
struct node* next;}
struct node* pointer;
i=0;
pointer->Instruction2dArray=malloc(max*sizeof(char*)) //max contains the number of written lines
while(CurrentArray[i][0]!=''){
pointer->Instruction2dArray[i]=malloc((strlen(CurrentArray[i]) 1)*sizeof(char));
strcpy(pointer->Instruction2dArray[i],CurrentArray[i]);
i ;
}
Я написал этот простой код для копирования текущего массива, но я почти уверен, что это самый медленный способ сделать это, и я не знаю, как сделать это быстрее.
Спасибо за вашу помощь.
Комментарии:
1. если все данные являются POD (без указателей на другие материалы), вы можете просто memcpy все это
2. «но я почти уверен, что это самый медленный способ сделать это» Вы проверили его? Действительно ли это медленно, и вы проверяли, какая часть была слишком медленной?
3. @GradyPlayer Но тогда ему нужно выделить больше памяти для максимально возможной длины строки, а не только для фактически используемой длины, и скопировать больше данных. Если существует огромная разница в максимальной и фактической длине, копирование всего может быть намного медленнее.
4. @12431234123412341234123 Я должен пройти тест, сделанный моим профессором, и этот код слишком медленный, чтобы пройти его
5. Почему вы хотите скопировать весь массив? Не могли бы вы просто скопировать часть, которая изменилась? (Я не уверен, правильно ли я понимаю проблему)
Ответ №1:
Поскольку вы сказали, что хотите больше операций вставки / удаления, связанные списки более предпочтительны. Если и только вам нужен более произвольный доступ, предпочитайте 2D-массивы строк.
Связанные списки, на мой взгляд, более оптимизированы для операций вставки / удаления.