Teknologian jakaminen

C-sarjan merkkijono (4) merkkijonon alustava simulaatio

2024-07-12

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

🌈个人主页:Luokkatoveri Yuchen 

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

Seuraavat ovat Stringin toiminnot, jotka toteutamme tässä artikkelissa:

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

Näiden toimintojen joukossa

string(const char* str = "");

Tällaisen kirjoittamisen tarkoitus on pääasiassa ottaa huomioon tyhjät merkkijonot ja lisätä oletusarvo. Jos saapuva merkkijono on tyhjä, se kopioidaan automaattisesti arvoon "0".

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

Näillä kahdella koodirivillä const-lisäyksen päätarkoitus on varmistaa, että näitä kahta funktiota voidaan kutsua riippumatta siitä, onko syötetty kokomerkkijono muokattavissa.

Laitamme yllä olevat koodit otsikkotiedostoon.

.cpp-tiedostossa käytämme sitä näiden toimintojen toteuttamiseen.

#include"String.h"

Esittelemme otsikkotiedoston .cpp-tiedoston alussa. Jotkut opiskelijat saattavat olla uteliaita, onko se ristiriidassa C++-kirjaston String.h-tiedoston kanssa, mutta tulos ei johdu siitä, että kääntäjä etsii nykyisestä hakemistosta. nykyinen Tiedosto on jo hakemistossa.

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

Tämä on merkkijonokoodin perustoteutus.

Seuraava on tämän merkkijonon testitiedosto

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

Itse asiassa alueelle sen alin kerros on iteraattori, ja iteraattori on pääasiassa paketti. Eri tyypit alareunassa on nimetty uudelleen iteraattorilla yhtenäisen superrakenteen muodostamiseksi.

Siksi niin kauan kuin perusiteraattori on rakennettu, aluetta voidaan käyttää.