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

Итератор для вектора... С++

Чет не выходит... Он же свободного доступа получается... мне надо удалить элемент из вектора с изменением его длинны соответственно.. и я дальше отнимаю от итератора единицу, так как все правые элементы поидее должны были сместиться на 1. с переменной счетчиком все нормально работает, а вот с итератором что т не то
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <random>
#include <functional>
using namespace std;
struct Test {
int a;
Test() : a(0) {}
explicit Test(const int a) : a(a) {}
friend ostream& operator<<(ostream& out, const Test& t) {
out << t.a;
return out;
}
};
struct is_odd {
bool operator()(const Test t)const { return t.a & 1; }
};
struct is_even {
bool operator()(const Test t)const { return ~t.a & 1; }
};

void load(vector<Test>& v, const size_t n, const int l = 10, const int r = 99) {
const uniform_int_distribution<> uid(l, r);
random_device rd;
mt19937_64 gen(rd());
for (size_t i = 0; i < n; ++i) v.emplace_back(Test(uid(gen)));
}
void show(const char* msg, const vector<Test>& v) {
cout << msg << ": ";
copy(v.begin(), v.end(), ostream_iterator<Test>(cout, " "));
cout.put('\n');
}
// Как-то так!
void clean(vector<Test>& v, function<bool(Test)>&& func) {
vector<Test>::iterator pos;
while ((pos = find_if(v.begin(), v.end(), func)) != v.end()) v.erase(pos);
}
int main() {
vector<Test> test;
load(test, 25);
show(" all", test);
// очистить от нечётных
auto va = test;
const is_odd odd;
clean(va, odd);
show("even", va);
// очистить от чётных
auto vb = test;
const is_even even;
clean(vb, even);
show(" odd", vb);

system("pause");
}
Александр Курило
Александр Курило
92 767
Лучший ответ
Владимир Егоров нужно будет проникнуться.. а так я опять наткнулся на теже яйца.... пзд... все хорошо конечно... упрощает писанину но блин какой от них толк если они не работают блин....
теперь попробовал вычислить дистанцию между двумя итераторами, текущим и начальным.
получаю число и далее по стандартной схеме. удаляю элемент указывая неявный итератор и плюсую результат дистанции.. не могу понять на что он ругается... опять переписывать кусок кода....
логично, да
http:// ru.cppreference.com/w/cpp/container/vector/erase
> Итераторы и указатели к удалённым элементам и к элементам, идущим за ними, становятся нерабочими.
ЕТ
Егор Табулин
42 621
Владимир Егоров а как лучше удалить с изменением длинны? или лучше использовать list?
Владимир Егоров хотя они вроде как идентичны
Валентин Ли это не геймдевру. тут цитаты не выделяются символом >