Memset w C++

Memset() jest funkcją C++. Kopiuje do obiektu pojedynczy znak określoną liczbę razy. Przydaje się do wypełnienia określonej liczby bajtów określoną wartością, zaczynając od określonego miejsca w pamięci. Jest zdefiniowany w plik nagłówkowy.

Składnia:

void* memset( void* str, int ch, size_t n); 

Memset() konwertuje wartość ch na unsigned char i kopiuje ją do każdego z pierwszych n znaków obiektu wskazywanego przez str[]. Jeśli obiektu nie można w prosty sposób skopiować (np. skalar, tablica lub struktura zgodna z C), zachowanie jest niezdefiniowane. Jeśli n jest większe niż rozmiar obiektu wskazywanego przez str, zachowanie jest niezdefiniowane.

Parametry:

  • str[]: Wskaźnik na obiekt, do którego chcesz skopiować znak.
  • ch: Znak do skopiowania. Może to być znak, wartość normalna lub wartość logiczna.
  • N: Liczba bajtów do skopiowania.

Wartość zwracana: Funkcja memset() zwraca str, wskaźnik do ciągu docelowego.

Złożoność czasowa: O(N) [Dla przejścia od początku do końca obiektu]
Złożoność przestrzeni pomocniczej: O(1)

Przykład:

C++




// C++ program to demonstrate memset> #include> #include> using> namespace> std;> // Driver Code> int> main()> {> > char> str[] => 'geeksforgeeks'> ;> > memset> (str,> 't'> ,> sizeof> (str));> > cout < < str;> > return> 0;> }>

Wyjście

tttttttttttttt 

Notatka: Możemy użyć memset() do ustawienia wszystkich wartości na 0 lub -1 również w przypadku całkowitych typów danych. Nie zadziała, jeśli użyjemy go do ustawienia innych wartości. Powód jest prosty, memset działa bajt po bajcie.

C++




// C++ Program to demonstrate that we can use memset() to> // set all values as 0 or -1 for integral data types also> #include> using> namespace> std;> // Driver Code> int> main()> {> > int> a[5];> > // all elements of A are zero> > memset> (a, 0,> sizeof> (a));> > for> (> int> i = 0; i <5; i++)> > cout < < a[i] < <> ' '> ;> > cout < < endl;> > // all elements of A are -1> > memset> (a, -1,> sizeof> (a));> > for> (> int> i = 0; i <5; i++)> > cout < < a[i] < <> ' '> ;> > cout < < endl;> > // Would not work> > memset> (a, 5,> sizeof> (a));> // WRONG> > for> (> int> i = 0; i <5; i++)> > cout < < a[i] < <> ' '> ;> }>

Wyjście

0 0 0 0 0 -1 -1 -1 -1 -1 84215045 84215045 84215045 84215045 84215045 

Przykład logiczny:

C++




// C++ Program to demonstrate that we can use memset() to> // set all values as boolean data types also> #include> using> namespace> std;> int> main()> {> > bool> prime[5];> > memset> (prime,> true> ,> sizeof> (prime));> > // If you print without using boolalpha it will print> > // like this> > for> (> int> i = 0; i <5; i++)> > cout < < prime[i] < <> ' '> ;> > cout < <> ' '> ;> > // If you use boolalpha it will print like this> > for> (> int> i = 0; i <5; i++)> > cout < < boolalpha < < prime[i] < <> ' '> ;> > return> 0;> }> // This code is contributed by Susobhan Akhuli>

Wyjście

1 1 1 1 1 true true true true true 

NOTATKA: W przypadku wartości logicznej obiekt musi być typu bool w przypadku języka C++. Np. bool tablica [n];

Zalety funkcji memset().

1. Zwiększ czytelność

Głównym celem memset() funkcją jest przekształcenie każdego znaku całego ciągu znaków w konkretny wew wartość przed przekazaniem jej jako danych wejściowych. Jest to jednoliniowy fragment kodu, dzięki czemu jest bardzo zwarty i ogólnie poprawia czytelność.

2. Zmniejsz liczbę linii kodu

Dzięki temu to samo zadanie udało się osiągnąć szybciej niż w przypadku pracochłonnej techniki memset() funkcja, która po prostu akceptuje dane wejściowe, zamiast niepotrzebnego używania pętli do przypisywania i konwertowania wartości każdego znaku w ciągu na wew wartość.

3. Jest szybszy

Dzięki temu to samo zadanie zostało wykonane szybko, a nie w sposób czasochłonny memset() samego wejścia funkcji, co eliminuje potrzebę wykonywania niepotrzebnych pętli w celu przypisania i konwersji wartości każdego znaku w strunowy do wew wartość.

4. Przydatne w pozbyciu się problemu niewspółosiowości

Język C++ memset() Funkcja pomaga programiście w rozwiązaniu problemu niewspółosiowości. Zdarzają się przypadki, w których odkryjesz, że procesor ma problemy z wyrównaniem danych, co skutkuje błędem programistycznym. The memcpy() I memcmp() metody w C++ są najlepszymi opcjami w tej sytuacji.

Notatka: memset to stara funkcja odziedziczona z C. Nie jest zbyt elastyczna przy wypełnianiu pamięci różnymi typami danych i wartościami. The std::wypełnij funkcja jest lepszą alternatywą dostępną w bibliotece algorytmów STL.