Memset v C++

Memset() je funkce C++. Zkopíruje jeden znak pro určený počet opakování do objektu. Je to užitečné pro naplnění určitého počtu bajtů danou hodnotou počínaje konkrétním paměťovým místem. Je definován v hlavičkový soubor.

Syntax:

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

Memset() převede hodnotu ch na unsigned char a zkopíruje ji do každého z prvních n znaků objektu, na který ukazuje str[]. Pokud objekt není triviálně kopírovatelný (např. skalární, pole nebo struktura kompatibilní s C), chování není definováno. Pokud je n větší než velikost objektu, na který ukazuje str, chování není definováno.

Parametry:

  • str[]: Ukazatelem na objekt zkopírujete znak.
  • ch: Postava, kterou chcete zkopírovat. Může to být znak, normální hodnota i booleovská hodnota.
  • n: Počet bajtů ke kopírování.

Návratová hodnota: Funkce memset() vrací str, ukazatel na cílový řetězec.

Časová náročnost: O(N) [Pro přechod od začátku do konce objektu]
Složitost pomocného prostoru: O(1)

Příklad:

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;> }>

Výstup

tttttttttttttt 

Poznámka: Můžeme použít memset() k nastavení všech hodnot jako 0 nebo -1 také pro integrální datové typy. Nebude fungovat, pokud jej použijeme k nastavení jako jiné hodnoty. Důvod je jednoduchý, memset funguje bajt po byte.

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] < <> ;> }>

Výstup

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

Booleovský příklad:

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>

Výstup

1 1 1 1 1 true true true true true 

POZNÁMKA: Pro boolean musí být objekt typu bool pro C++. Např. bool arr[n];

Výhody funkce memset().

1. Zvyšte čitelnost

Hlavním účelem memset() funkcí je transformovat každý znak celého řetězce na konkrétní int hodnotu před jejím předáním jako vstup. Jedná se o jednořádkový kód, díky čemuž je vysoce kompaktní a celkově zlepšuje čitelnost.

2. Snižte počet řádků kódu

Stejný úkol byl proveden rychleji než pracná technika s využitím tohoto memset() funkce, která pouze přijímá vstup, spíše než zbytečné používání smyček k přiřazení a převodu hodnoty každého znaku v řetězci na int hodnota.

3. Je rychlejší

Stejný úkol byl proveden rychle, na rozdíl od časově náročného způsobu použití tohoto memset() samotný vstup funkce, což eliminuje potřebu zbytečných smyček k přiřazení a převodu hodnoty každého znaku v tětiva do an int hodnota.

4. Užitečné při odstraňování problémů s nesouosostí

Jazyk C++ memset() Tato funkce pomáhá programátorovi vyřešit problém s nesouosostí. Existují případy, kdy zjistíte, že procesor má potíže se zarovnáním dat, což má za následek chybu v programování. The memcpy() a memcmp() metody v C++ jsou v této situaci nejlepší možnosti.

Poznámka: memset je stará funkce zděděná z C. Při plnění paměti různými datovými typy a hodnotami není příliš flexibilní. The std::fill funkce je lepší alternativou dostupnou v knihovně STL Algorithm.