Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🌈个人主页:Compañero de clase Yuchen
💫个人格言:“成为自己未来的主人~”
Las siguientes son las funciones de String que implementaremos en este artículo:
- #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;
- };
- }
Entre estas funciones
string(const char* str = "");
El propósito de escribir de esta manera es principalmente tener en cuenta las cadenas vacías y agregar un valor predeterminado. Si la cadena entrante está vacía, se copiará automáticamente a "0".
- const char* c_str() const;
- size_t size() const;
En estas dos líneas de código, el objetivo principal de agregar const es garantizar que estas dos funciones puedan llamarse independientemente de si el tamaño de la cadena pasada es modificable.
Colocamos los códigos anteriores en el archivo de encabezado.
En el archivo .cpp, lo usamos para implementar estas funciones.
#include"String.h"
Introducimos el archivo de encabezado al comienzo del archivo .cpp. Algunos estudiantes pueden tener curiosidad sobre si entrará en conflicto con el archivo String.h en la biblioteca C ++, pero el resultado no es así, porque el compilador buscará en el directorio actual. el actual El archivo ya existe en el directorio.
- #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];
- }
-
- }
Esta es la implementación básica del código String.
El siguiente es el archivo de prueba para esta cadena.
- #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;
- }
De hecho, para el rango, su capa inferior es un iterador, y el iterador es principalmente un paquete. Los diferentes tipos en la parte inferior se renombran con iterador para construir una superestructura unificada.
Por lo tanto, siempre que se construya el iterador básico, se puede utilizar el rango para.