Самый быстрый способ скопировать 2d-массив в C?

#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-массивы строк.

Связанные списки, на мой взгляд, более оптимизированы для операций вставки / удаления.