logo

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.

jakie są wymiary ekranu mojego komputera

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.