c++ kopiowanie tablic dynamicznych

0

Witam,

Mam taki kod:

string *tablica_lista= new string[30]     ; 

void powieksz_liste(int ilosc_elemnentow)   
         {
           string *tablica_lista2= new string[ilosc_elemnentow]      ;
           for(int i=0;i<old_lista;++i){tablica_lista2[i]=tablica_lista[i];}
           delete [] tablica_lista                                   ;
           tablica_lista=tablica_lista2                              ;                 
         }


int mian()
{
   powieksz_liste(45)
}
 

Czy istnieje bardziej wydajny sposób kopiowania tablic dynamicznych?

0

Dziwnie porozstawiane średniki.
A odpowiadając na pytanie: można użyć memcpy.

0

Po pierwsze, starsznie brzydko formatujesz kod.
Po drugie, skąd w tej pętli for wzięło się old_tablica ?
Po trzecie, co jest niewydajnego w tym kodzie?

Ewentualnie możesz użyć funkcji CopyMemory z biblioteki Windows.h.

0

funkcja memcpy() może być szybsza

1

std::string chcecie za pomocą memcpy kopiować? To raczej jest niemądre. Po prostu użyj std::copy - skopiuje to najlepiej jak się da dla tego typu obiektu, dla std::string będzie to pewnie zwykła pętla.

0

Przecież w stringu dane masz ułożone jak w zwykłej tablicy i w wektorze, czyli ciągle, a nie jak w liście, kolejce, mapie i innych kontenerach. Oczywiście, że można skopiować za pomocą tamtych funkcji.

2
MJay napisał(a):

Przecież w stringu dane masz ułożone jak w zwykłej tablicy i w wektorze, czyli ciągle, a nie jak w liście, kolejce, mapie i innych kontenerach. Oczywiście, że można skopiować za pomocą tamtych funkcji.

Oczywiście, że nie. To wszystko jest zależne od implementacji, standard nic o tym nie mówi. libstdc++ np. używa mechanizmu copy on write.

Za pomocą memcpy można bezpiecznie kopiować tylko obiekty, dla których std::is_trivially_copyable będzie true.

Chyba nie ma jeszcze implementacji biblioteki standardowej, która ma wszystkie te szablony z <type_traits>, ale GCC ma wbudowane mechanizmy do sprawdzania takich rzeczy:

#include <iostream>
#include <string>
 
int main() {
  std::cout << __has_trivial_copy(std::string) << '\n';
 
  return 0;
}

Wynik:

[email protected] smieciki % ./a.out                          
0

Jak widać nie, nie można kopiować std::string za pomocą memcpy.

Tutaj przykład co się dzieje, kiedy się tak zrobi: http://ideone.com/XJJLt Na ideone w ogóle nie działa a u mnie jest tak:

[email protected] smieciki % ./a.out                 
tab1 przed:
ala ma kota
ala ma kota
ala ma kota
tab1 po:
kot ma aids
kot ma aids
kot ma aids
tab2 przed usunieciem tab1:
kot ma aids
kot ma aids
kot ma aids
kot ma aids
kot ma aids
tab2 po usunieciu tab1:
kot ma aids1��
              ����kot ma aids1
                              ����kot ma aidsAX�����(�X�1

                                                         kot ma aids1

                                                                     kot ma aids�%

Z std::copy działa prawidłowo. Jak widać kopiowanie za pomocą memcpy powoduje, że oryginał jest zmieniony po operacji na "kopii" a po jego usunięciu dzieją się cuda.

0

Ja używam często i z powodzeniem memcpy, memmove, memcmp itd., ale na prostych obiektach nieposiadających pamięci przydzielanej dynamicznie. W przeciwnym wypadku faktycznie dzieją się cuda, chociaż wydaje mi się, że też się da, ale trzeba by dokładnie prześledzić cykl życiowy każdego obiektu, obserwować co się dzieje z pamięcią, którą rezerwuje itd. To tylko tyle z moich skromnych obserwacji.

0

chociaż wydaje mi się, że też się da, ale trzeba by dokładnie prześledzić cykl życiowy każdego obiektu
od tego w C++ są instruktory kopiujące i przesuwające, i klasa kopiowanego obiektu powinna je mieć (a jeśli nie ma, to znaczy że nie należy tego kopiować).

1 użytkowników online, w tym zalogowanych: 0, gości: 1