Implementación de simulación de adición, eliminación y modificación de cadenas de C++

Tabla de contenido

1.función de reserva

2.función de cambio de tamaño

3. insertar función 

4.función de borrado

5. encontrar función

6.【】Sobrecarga del calificador de acceso 


1.función de reserva

1.1 Función

Cambie la capacidad de espacio del objeto Sting actual. Si la capacidad que necesita cambiarse es mayor que la capacidad real del objeto de cadena, vuelva a solicitar espacio y amplíe la capacidad. De lo contrario, no es necesario ampliar la capacidad. Sin valor de retorno.

1.2 Lógica de implementación

(1) Determine si la capacidad n que necesita expandirse es mayor que la capacidad real del objeto actual

(2) Solicite un espacio de tamaño n en el montón

(3) Copie la cadena del objeto en el espacio recién abierto en el montón y libere el espacio en el montón al que apunta la cadena.

(4) Cambiar el valor de capacidad real del objeto actual

El código de implementación es el siguiente.

		//增容改变空间大小,只有当要增容的空间大小大于当前对象的容量的时候,才增容
		void reserve(size_t n)
		{
			if (n > _capacity)
			{
				char* tmp = new char[n + 1];
				strcpy(tmp, _str);
				delete[] _str;
				_str = tmp;
 
				_capacity = n;
			}
		}

2.función de cambio de tamaño 

2.1 Función
: cambiar el número real de cadenas en el objeto de picadura actual y cambiar la capacidad e inicializarlo. Sin valor de retorno.

2.2 Implementar lógica
(1) Determinar si la capacidad n que debe cambiarse es mayor que el número real de objetos actuales

(2) Si n es menor o igual que el número real de objetos actuales, asigne el enésimo carácter de la cadena al identificador final de la cadena '\0' y cambie el número real de la cadena a n.

(3) Si n es mayor o igual que el número real de objetos actuales y mayor que la capacidad real del objeto actual, llame a la función de reserva para expandir la capacidad real de la cadena a n

(4) Llame a la función memset para inicializar todo el espacio expandido en str. El valor inicial predeterminado de str es '\0'

(5) Luego cambie el tamaño real del objeto actual a n y asigne el enésimo carácter de la cadena como identificador final de la cadena.
 

 
		//改变字符串的实际个数以及改变容量大小,并且初始化
		void resize(size_t n, char str = '\0')
		{
			if (n <= size())
			{
				_str[n] = '\0';
				_size = n;
			}
			else
			{
				if (n > capacity())
				{
					reserve(n);
				}
				memset(_str + _size, str, n - _size);
				_size = n;
				_str[_size] = '\0';
			}
		}

3. insertar función 

3.1 Función
Insertar un solo carácter o cadena en cualquier posición de la cadena, por lo que tiene dos funciones sobrecargadas

3.2 Valor de retorno
Devuelve el objeto de cadena después del carácter o cadena insertado

3.3 Implementar lógica
(1) Determinar si la suma n de la longitud de la cadena a insertar (len) más el valor del subíndice insertado es mayor que la capacidad real del objeto actual

(2) Si n es mayor que la capacidad real del objeto actual, expanda la capacidad real del objeto a n

(3) Declare una variable end, que es el último subíndice del último elemento ('\0') en la cadena del objeto después de cambiar las posiciones de len, de modo que end siempre apunte a la siguiente posición del elemento que necesita ser desplazada.

(4) Realice una operación de cambio de matriz para cambiar la cadena en el objeto a elementos len más adelante

(5) Al llamar a la función strncpy (esta función puede copiar n elementos de una cadena a otra cadena), copie la cadena que debe insertarse en la cadena del objeto actual y luego cambie la cadena Número real de caracteres
 

		//在任意位置插入字符串
		string& insert(size_t pos, const char* str)
		{
			assert(pos <= _size);
			size_t len = strlen(str);
			if (len + _size > _capacity)
			{
				reserve(len + _size);
			}
			size_t end = _size + len + 1;
			while (end > pos + len)
			{
				_str[end - 1] = _str[end - len - 1];
				end--;
			}
			strncpy(_str + pos, str, len);
			_size += len;
			return *this;
		}
		//在任意位置插入字符
		string& insert(size_t pos, char ch)
		{
			assert(pos <= _size);
			if (_size == _capacity)
			{
				_capacity == 0 ? reserve(4) : reserve(2 * _capacity);
			}
			size_t end = _size + 1;//此处不能使end = _size,因为当end = pos时,end--,就会发生数组越界
			while (end > pos)
			{
				_str[end] = _str[end - 1];
				end--;
			}
			_str[pos] = ch;
			_size++;
			return *this;
		}

 4.función de borrado 

4.1 Función:
a partir del subíndice pos de la cadena sting, elimine datos con una longitud de len

4.2 Valor de retorno
Devuelve el objeto de cadena después de eliminar caracteres

4.3 Lógica de implementación
(1) Si el subíndice pos de los datos que se eliminarán más el número len que se eliminará es mayor o igual que el número real de cadenas, asigne los datos con el subíndice pos como identificador de final de cadena (' \0 ')

(2) De lo contrario, llame a la función strycpy para copiar los datos después de pos + len en la matriz de cadenas al subíndice pos.

(3) Cambiar el número real de elementos en el valor object_size

		//删除字符串
		string& erase(size_t pos = 0, size_t len = npos)
		{
			assert(pos < _size);
			if (pos + len >= _size)
			{
				_str[pos] = '\0';
				_size = pos;
			}
			else
			{
				strcpy(_str + pos, _str + pos + len);
				//strncpy(_str + pos, _str + pos + len, _size - pos - len + 1);
				_size -= len;
			}
			return *this;
		}
		//清除字符串
		void clear()
		{
			_str[0] = '\0';
			_size = 0;
		}


 5. encontrar función  

5.1 Función:
buscar los caracteres y cadenas correspondientes de la cadena Sting

5.2 Valor de retorno
Si se encuentra el subíndice de la primera letra, se devolverá -1 si no se encuentra.

5.3 Implementar lógica
para encontrar un solo carácter:

(1) Recorre cada carácter a través del iterador

(2) Encuentre el carácter correspondiente y devuelva el subíndice del carácter.

(3) Si no se encuentra, devuelve -1

Encuentra una cadena:

(1) Encuentre el puntero a la primera letra de la cadena en la cadena mediante la función strstr.

(2) A través del puntero obtenido, devuelve su posición en la cadena.
 

 

		//查找字符
		size_t find(char ch) const
		{
			auto it = begin();
			while (it != end())
			{
				if (*it == ch)
				{
					return (it - _str);
				}
				it++;
			}
			return npos;
		}
		//查找字符串
		size_t find(const char* str) const
		{
			char* res = strstr(_str, str);
			if (res != nullptr)
			{
				return (res - _str);
			}
			return npos;
		}

6.【】Sobrecarga del calificador de acceso  

6.1 Función

Acceda y modifique los elementos especificados en la cadena a través del objeto [int n]

6.2 Valor de retorno

Devuelve el elemento especificado en la cadena actual según el valor en []

6.3 Lógica de implementación

Devuelve directamente una referencia al elemento de cadena con subíndice pos

		//2.取值符号[]重载
		char& operator[](size_t pos)
		{
			assert(pos < _size);
			return _str[pos];
		}

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_63246738/article/details/131609106
Recomendado
Clasificación