le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🌈个人主页:Compagno di classe Yuchen
💫个人格言:“成为自己未来的主人~”
Di seguito sono riportate le funzioni di String che implementeremo in questo articolo:
- #pragma once
- #include<iostream>
- #include<assert.h>
- using namespace std;
-
- namespace bit
- {
- class string
- {
- public:
- typedef char* iterator;
- iterator begin();
- iterator end();
-
- string(const char* str = "");
- ~string();
- const char* c_str() const;
- size_t size() const;
- char& operator[](size_t pos);
- private:
- char* _str;
- size_t size;
- size_t _capacity;
- };
- }
Tra queste funzioni
string(const char* str = "");
Lo scopo di scrivere in questo modo è principalmente quello di prendere in considerazione le stringhe vuote e aggiungere un valore predefinito. Se la stringa in arrivo è vuota, verrà automaticamente copiata su "0".
- const char* c_str() const;
- size_t size() const;
In queste due righe di codice, lo scopo principale dell'aggiunta di const è garantire che queste due funzioni possano essere chiamate indipendentemente dal fatto che la stringa size passata sia modificabile.
Inseriamo i codici sopra nel file di intestazione.
Nel file .cpp lo utilizziamo per implementare queste funzioni.
#include"String.h"
Introduciamo il file di intestazione all'inizio del file .cpp. Alcuni studenti potrebbero essere curiosi di sapere se entrerà in conflitto con il file String.h nella libreria C++, ma il risultato non lo è perché il compilatore effettuerà la ricerca nella directory corrente e. il file corrente Il file esiste già nella directory.
- #define _CRT_SECURE_NO_WARNINGS
- #include"String.h"
- namespace bit
- {
- string::iterator string::begin()
- {
- return _str;
- }
- string::iterator string::end()
- {
- return _str + _size;
- }
-
- string::string(const char* str)
- :_size(strlen(str))
- {
- _str = new char[_size + 1];
- _capacity = _size;
- strcpy(_str, str);
- }
- string::~string()
- {
- delete[] _str;
- _str = nullptr;
- _size = _capacity = 0;
- }
- const char* string::c_str() const
- {
- return _str;
- }
- size_t string::size() const
- {
- return _size;
- }
- char& string::operator[](size_t pos)
- {
- assert(pos < _size);
- return _str[pos];
- }
-
- }
Questa è l'implementazione base del codice String.
Quello che segue è il file di test per questa stringa
- #define _CRT_SECURE_NO_WARNINGS
- #include<iostream>
- #include"String.h"
- namespace bit
- {
- void test_string1()
- {
- bit::string s1("hello world");
- cout << s1.c_str() << endl;
- for (size_t i = 0; i < s1.size(); i++)
- {
- s1[i]++;
- }
- for (size_t i = 0; i < s1.size(); i++)
- {
- cout << s1[i] << " ";
- }
- cout << endl;
- string::iterator it1 = s1.begin();
- while (it1 != s1.end())
- {
- cout << *it1 << " ";
- ++it1;
- }
- cout << endl;
- for (auto e : s1)
- {
- cout << e << " ";
- }
- cout << endl;
- bit::string s2;
- cout << s2.c_str() << endl;
- }
- }
- int main()
- {
- bit::test_string1();
-
- return 0;
- }
Infatti, per l'intervallo for, il suo strato inferiore è un iteratore e l'iteratore è principalmente un pacchetto. I diversi tipi nella parte inferiore vengono rinominati con iteratore per creare una sovrastruttura unificata.
Pertanto, finché viene creato l'iteratore di base, è possibile utilizzare range for.