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 value
elementos del mismo valor. Y finalmente volvieron iterador está apuntando al último elemento válido.
Mirar hacia fuera: el remove
proceso 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 remove
obtenidos 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
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
los efectos de ambos es el mismo, es porque result
hacer 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 C
después de su examen, esta vez a la estancia en el iterador equivalente A A A A A C C C C C A
en primer C
lugar, 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 A
en el primer C
y 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 vector
de 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
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
vector
Contenedor, cuando el inserto (push_back) un elemento,end()
los rendimientos de operación iteradores fracaso, porque va a actualizar el contenedor, expanda el contenedor.- 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. - 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
- En el contenedor deque cabecera o la cola de tal manera que el elemento de inserción no falle cualquier iteradores.
- 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.
- 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.