una repetidos posicion para numeros lista funcion eliminar elementos elemento dato contenido borrar arreglo array c++ stl vector erase-remove-idiom

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; }


Demostración en línea :

#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--) { }