Technologieaustausch

C-Serie-String (4) Vorläufige Simulationsimplementierung von String

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🌈个人主页:Klassenkamerad Yuchen 

💫个人格言:“成为自己未来的主人~”   

Die folgenden Funktionen von String werden wir in diesem Artikel implementieren:

  1. #pragma once
  2. #include<iostream>
  3. #include<assert.h>
  4. using namespace std;
  5. namespace bit
  6. {
  7. class string
  8. {
  9. public:
  10. typedef char* iterator;
  11. iterator begin();
  12. iterator end();
  13. string(const char* str = "");
  14. ~string();
  15. const char* c_str() const;
  16. size_t size() const;
  17. char& operator[](size_t pos);
  18. private:
  19. char* _str;
  20. size_t size;
  21. size_t _capacity;
  22. };
  23. }

Unter diesen Funktionen

string(const char* str = "");

Der Zweck dieses Schreibens besteht hauptsächlich darin, leere Zeichenfolgen zu berücksichtigen und einen Standardwert hinzuzufügen. Wenn die eingehende Zeichenfolge leer ist, wird sie automatisch auf „0“ kopiert.

  1. const char* c_str() const;
  2. size_t size() const;

In diesen beiden Codezeilen besteht der Hauptzweck des Hinzufügens von const darin, sicherzustellen, dass diese beiden Funktionen aufgerufen werden können, unabhängig davon, ob die übergebene Größenzeichenfolge änderbar ist.

Wir fügen die oben genannten Codes in die Header-Datei ein.

In der .cpp-Datei verwenden wir es, um diese Funktionen zu implementieren.

#include"String.h"

Wir führen die Header-Datei am Anfang der .cpp-Datei ein. Einige Schüler sind möglicherweise neugierig, ob es zu Konflikten mit der String.h-Datei in der C++-Bibliothek kommt, aber das Ergebnis liegt nicht daran, dass der Compiler im aktuellen Verzeichnis sucht Die aktuelle Datei ist bereits im Verzeichnis vorhanden.

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include"String.h"
  3. namespace bit
  4. {
  5. string::iterator string::begin()
  6. {
  7. return _str;
  8. }
  9. string::iterator string::end()
  10. {
  11. return _str + _size;
  12. }
  13. string::string(const char* str)
  14. :_size(strlen(str))
  15. {
  16. _str = new char[_size + 1];
  17. _capacity = _size;
  18. strcpy(_str, str);
  19. }
  20. string::~string()
  21. {
  22. delete[] _str;
  23. _str = nullptr;
  24. _size = _capacity = 0;
  25. }
  26. const char* string::c_str() const
  27. {
  28. return _str;
  29. }
  30. size_t string::size() const
  31. {
  32. return _size;
  33. }
  34. char& string::operator[](size_t pos)
  35. {
  36. assert(pos < _size);
  37. return _str[pos];
  38. }
  39. }

Dies ist die grundlegende String-Code-Implementierung.

Das Folgende ist die Testdatei für diesen String

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include"String.h"
  4. namespace bit
  5. {
  6. void test_string1()
  7. {
  8. bit::string s1("hello world");
  9. cout << s1.c_str() << endl;
  10. for (size_t i = 0; i < s1.size(); i++)
  11. {
  12. s1[i]++;
  13. }
  14. for (size_t i = 0; i < s1.size(); i++)
  15. {
  16. cout << s1[i] << " ";
  17. }
  18. cout << endl;
  19. string::iterator it1 = s1.begin();
  20. while (it1 != s1.end())
  21. {
  22. cout << *it1 << " ";
  23. ++it1;
  24. }
  25. cout << endl;
  26. for (auto e : s1)
  27. {
  28. cout << e << " ";
  29. }
  30. cout << endl;
  31. bit::string s2;
  32. cout << s2.c_str() << endl;
  33. }
  34. }
  35. int main()
  36. {
  37. bit::test_string1();
  38. return 0;
  39. }

Tatsächlich ist die unterste Ebene des Bereichs ein Iterator, und der Iterator ist hauptsächlich ein Paket. Die verschiedenen Typen unten werden in Iterator umbenannt, um eine einheitliche Oberstruktur zu bilden.

Daher kann der Bereich für verwendet werden, solange der Basisiterator erstellt ist.