Другие языки программирования и технологии

Подскажите оператор для удаления элемента из массива. Для С++

А, для C++..Метод erase динамических массивов шаблона vector.
Например, вот для твоего примера:

#include<iostream>
#include<vector>
using namespace std;
main(){vector<int> a;
vector<int>::iterator sIt; vector<int>::iterator tIt;
for(int i=0;i< 20;i++)a.push_back(i%4); sIt=a.begin();
for(tIt=a.begin(); tIt!=a.end(); tIt++)cout<< *tIt; cout<< endl;
for(tIt=a.begin(); tIt!=a.end(); tIt++)if(*tIt==0)a.erase(tIt);
for(tIt=a.begin(); tIt!=a.end(); tIt++)cout<< *tIt; cout<< endl;
cin.get();}
Ratmir Mazhitov
Ratmir Mazhitov
56 928
Лучший ответ
Demon Волк Если в конце вектора будет ноль:
for (int i=0; i < 21; i++) a.push_back(i % 4);

то такой код может привести к ошибке исполнения:
for (tIt=a.begin(); tIt!=a.end(); tIt++) if (*tIt==0) a.erase(tIt);

безопасно будет:
for(tIt=a.begin(); tIt != a.end();) tIt = (*tIt == 0) ? a.erase(tIt) : tIt + 1;
Ratmir Mazhitov Небольшая ошибочка вкралась, при некоторых длинах массива будет сказываться. Чтобы ее устранить, замени все != на
Ratmir Mazhitov на знак <
To ra: спасибо, уже и сам заметил :( Мой вариант исправления будет даже короче.
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
int a[] = { 1, 0, 2, 0, 3, 0, 4, 0 };
int sz = sizeof(a) / sizeof(a[0]);

vector < int > v(a, a + sz);
cout << "vector:\n";
vector < int >::iterator it;
for (it = v.begin(); it != v.end(); ++it) cout << ' ' << *it;
it = remove(v.begin(), v.end(), 0);
v.resize(it - v.begin());
cout << "\nvector after remove items:\n";
for (it = v.begin(); it != v.end(); ++it) cout << ' ' << *it;

cout << "\n\narray:\n";
for (int *p = a; p < a + sz; ++p) cout << ' ' << *p;
int *eofa = remove(a, a + sz, 0);
cout << "\narray after remove items:\n";
for (int *p = a; p < eofa; ++p) cout << ' ' << *p;
}

Заметь, что размер массива, в отличии от размера vector'a изменить нельзя. Элементы в массиве просто сдвинулись на место нулевых, а его размер остался прежним.

Естественно, если тебе по какой-то причине не нравится шаблонная функция remove, ты можешь написать собственную реализацию.

Ну и если не нравиться код с указателями и итераторами, то его можно переписать, чтобы обращаться к элементам массива и вектора по индексу:

...
for (int c = 0; c < v.size(); ++c) cout << ' ' << v[c];
...
...
for (int c = 0; c < sz; ++c) cout << ' ' << a[c];
int newsz = remove(a, a + sz, 0) - a;
cout << "\narray after remove items:\n";
for (int c = 0; c < newsz; ++c) cout << ' ' << a[c];
Demon Волк
Demon Волк
54 940
удалить элемент из массива... .

что есть массив?
При объявлении массива -
char A[5]
мы говорим компилятору выделить память для пяти переменных типа char
можно сказать, что мы объявили пять переменных
char a1;
char a2;
...
char a5;

(в массиве они идут одна за другой)
мы можем удалить переменную char a2 если она равна нулю?
можно заменить. или переписать в новый массив. если хотите удалять - обращайтесь к стекам, очередям и проч. на указателях. В принципе можно присвоить элементу NIL, но я бы не советовала. лучше какой-нибудь неиспользуемый символ.
Mony. .
Mony. .
1 163

Похожие вопросы