c++ - repetidos - Eliminar elementos vectoriales basados en el índice
eliminar una posicion de un vector (5)
Quería eliminar los elementos del vector en función del índice, es decir, todos los elementos pares indexados. He leído sobre el borrado borrar idioma, pero no puedo ver cómo aplicarlo. Esto es lo que intenté:
vector<int> line;
line.reserve(10);
for(int i=0;i<10;++i)
{
line.push_back(i+1);
}
for(unsigned int i=0;i<line.size();++i)
{
//remove the even indexed elements
if(i%2 == 0)
{
remove(line.begin(),line.end(),line[i]);
}
}
line.erase( line.begin(),line.end() );
Esto borra todo el vector. Esperaba eliminar solo los elementos que habían sido marcados por el algoritmo de eliminación.
Entonces probé esto
for(unsigned int i=0;i<line.size();++i)
{
//remove the even indexed elements
if(i%2 == 0)
{
line.erase( remove(line.begin(),line.end(),line[i]),line.end() );
}
}
De nuevo, esto no funciona, ya que hay un problema al eliminar, los índices parecen cambiar al iterar sobre el vector. ¿Cuál debería ser el enfoque correcto para lograr esto?
Aquí se explica cómo usar el método borrar-eliminar para eliminar números impares de un vector. No estoy seguro de si puede eliminar elementos basados en el índice, porque remove_if () aplica el predicado en los valores apuntados por los iteradores en lugar del iterador mismo.
Consulte lo siguiente: http://cplusplus.com/reference/algorithm/remove_if/
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);
v.push_back(44);
v.push_back(55);
v.push_back(66);
v.push_back(77);
ostream_iterator<int> printit(cout, " ");
cout << "Before removing odd numbers" << endl;
copy(v.begin(), v.end(), printit);
v.erase(remove_if(v.begin(), v.end(),
[] (int e) { return e%2 == 1; }), v.end());
cout << endl;
cout << "After removing odd numbers" << endl;
copy(v.begin(), v.end(), printit);
cout << endl;
}
#include <vector>
#include <algorithm>
#include <iostream>
/*Check if Index is Even or Odd*/
bool is_IndexEven(int i)
{
static int k = 1;
/*Handle Index 0 as special case as per choice*/
if(k == 1)
{
k++;
return false;
}
if(k++ % 2)
return true;
else
return false;
}
int main()
{
using namespace std;
int elements[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// create a vector that holds the numbers from 0-9.
vector<int> v(elements, elements + 10);
/*Display elements before removal*/
vector<int>::const_iterator iter = v.begin();
cout<<"Before/n";
for(iter;iter!= v.end();++iter)
{
cout<<*iter;
}
/*Remove_if + Erase Algorithm for one step removal*/
v.erase( remove_if(v.begin(), v.end(), is_IndexEven), v.end() );
/*Display result after elements removed*/
cout<<"/nAfter/n";
iter = v.begin();
for(iter;iter!= v.end();++iter)
{
cout<<*iter;
}
return 0;
}
¿Por qué no usas remove_if ? Use una variable estática dentro de la función para señalar el índice del elemento actual.
Al pasar de 0
a size
, terminará omitiendo la mitad de los elementos porque los índices cambian a medida que borra los elementos. Haga que su ciclo for
pase de size()
a 0
:
for(unsigned int i = line.size(); i > 0; i--)
{
}
Una respuesta que se generaliza no solo sobre el tipo de contenedor que se manejará sino también sobre el tipo de contenedor que contiene los índices que se eliminarán, se da en: Borrado de elementos en stl :: vector mediante el uso de índices