iteradores C ++ STL_2 contenedores fallan?

funciones de quitar y de borrado

En total: remove funcionar como elementos eliminar, la necesidad de un uso cuidadoso.
Descripción del algoritmo: fue el primero en encontrar una posición del elemento, y de este contenedor de desplazamiento posición, los últimos elementos se mueven secuencialmente por delante, y valueelementos del mismo valor. Y finalmente volvieron iterador está apuntando al último elemento válido.
Mirar hacia fuera: el removeproceso de algoritmo, y no modifica los envases originales size(), y end()otras funciones. Porque cuando no hay ninguna concreta remove()es una función de un recipiente que no va a cambiar el valor del coeficiente de correlación del envase original, a menos que explícitamente el fin de su uso list.remove(1)y así sucesivamente.
Desde un punto de vista lógico, la última [desde removeobtenidos iterator- _result, el extremo del recipiente end()) elementos dentro de este intervalo no tiene sentido.

Como la siguiente realización:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
template <class _ForwardIterator, class T>
_ForwardIterator Remove (_ForwardIterator first, _ForwardIterator last, const T& val)
{
  _ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      *result = move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}
int main()
{
	typedef  vector<char> Vector;
	Vector vec;
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('A');
	Vector::iterator p = Remove(vec.begin(),vec.end(),'A');
	cout << vec.end() - p << endl;
	for(Vector::iterator ite = vec.begin() ; ite != vec.end() ; ++ite)
	   cout << *ite << " " ;
	return 0 ;
}

Aplicación de los resultados
Aquí Insertar imagen Descripción

o

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	typedef  vector<char> Vector;
	Vector vec;
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('A');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('C');
	vec.push_back('A');
	Vector::iterator p = remove(vec.begin(),vec.end(),'A');
	cout << vec.end() - p << endl;
	for(Vector::iterator ite = vec.begin() ; ite != vec.end() ; ++ite)
	   cout << *ite << " " ;
	return 0 ;
}

El efecto de la aplicación de
Aquí Insertar imagen Descripción
los efectos de ambos es el mismo, es porque resulthacer discos para el cribado se inicia iterador apunta a first, a continuación, como ejemplo A A A A A C C C C C A, un cinco por detrás Cdespués de su examen, esta vez a la estancia en el iterador equivalente A A A A A C C C C C Aen primer Clugar, a continuación, por lo que cuando el resultado de la salida, no sólo se han proyectado los resultados C C C C C, habrá lista original A A A A A C C C C C Aen el primer Cy los elementos detrás C C C C C A, después de que se emite C C C C C C C C C C A. Para evitar este efecto se produce con tanta frecuencia en el relleno de nuevo vec.erase(remove(vec.begin(),vec.end(),'A'),vec.end());para eliminar los datos posteriores no deseadas.
Así que remove()justo después de que el elemento se puede mover para eliminar los elementos vectorde la parte delantera, en lugar de eliminarlo. Para eliminar efectivamente la necesidad de utilizar con erase().

A continuación, utilice la erase()función también prestar atención a la cuestión:

	for(ite=vec.begin();ite!=vec.end();){
		if(*ite == 'A')
			vec.erase(ite);
	//	else 
		//	++ite;
	} 

Esta utilización está mal, porque erase()entonces, la guía de campo es ITE
Aquí Insertar imagen Descripción
este caso, no se eliminan los siguientes valores iguales consecutivos, desde erase()el retorno del siguiente elemento a ser removido iterador:

	for(ite=vec.begin();ite!=vec.end();){
		if(*ite == 'A')
			ite = vec.erase(ite);
	//	else 
		//	++ite;
	} 

Entonces, ¿qué forma común

for (ite = vec.begin(); ite != vec.end(); ) {
		if (*ite == 'A')
			ite = vec.erase(ite);
		else 
			++ite;
	}

Información general sobre el fracaso de otros iteradores:
vector

  1. vectorContenedor, cuando el inserto (push_back) un elemento, end()los rendimientos de operación iteradores fracaso, porque va a actualizar el contenedor, expanda el contenedor.
  2. Cuando la operación de eliminación ( erase(), pop_back()después), punto a punto iterador eliminar toda fallar; referencia de eliminación para el elemento detrás del punto de iterador ya no funcionará. De hecho, esto también es muy buena comprensión, se han suprimido, el punto eliminado iterador que fallar ah, porque el contenedor vector es el cambio de tamaño dinámico, todos los elementos se eliminan, a continuación, los elementos detrás de la afirmación hacia adelante ah.
  3. Cuando el inserto (push_back) un elemento, en comparación con el valor de retorno de la Capacidad hasta que no haya intervención de cambio elementos, la necesidad de volver a cargar el contenedor entero. El primer extremo y la operación vuelve a la iterador fallará, esto debe ser una razón para la expansión.

deque

  1. En el contenedor deque cabecera o la cola de tal manera que el elemento de inserción no falle cualquier iteradores.
  2. En su primera sección de la cola eliminación de elementos o elemento a ser removido solamente hacer punto iterador falla, como se ha descrito anteriormente, el un ejemplo.
  3. Insertar y operaciones de borrado en cualquier otra posición del elemento contenedor deque contenedor se apuntan al fracaso de todos los iteradores. Debido a que el elemento de la cola es una relación bidireccional entre la relación adyacente, en lugar de conectado por punteros.

list
no aumentará cualquier fallo elemento iterador. Al eliminar un elemento, además del elemento de repetidor actual que ser eliminado, el otro iterador no fallará, porque el puntero es confiar en los elementos eliminados conectado, se elimina y se inserta que no afectará adyacencias.

set
Si se elimina el elemento que apunta es el iterador, éste falla. Cualquier aumento en los elementos operativos eliminar otros no causan el fracaso de iteradores. Debido a que se clasifica automáticamente.

map
Si se elimina el elemento que apunta es el iterador, éste falla. Cualquier aumento en los elementos operativos eliminar otros no causan el fracaso de iteradores. Debido a que se clasifica automáticamente.


Parte de la información tiene una red de datos de referencia.

Publicados 222 artículos originales · ganado elogios 48 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44116998/article/details/104569271
Recomendado
Clasificación