
Другие языки программирования и технологии
Итератор для вектора... С++
Чет не выходит... Он же свободного доступа получается... мне надо удалить элемент из вектора с изменением его длинны соответственно.. и я дальше отнимаю от итератора единицу, так как все правые элементы поидее должны были сместиться на 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");
}
#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");
}
логично, да
http:// ru.cppreference.com/w/cpp/container/vector/erase
> Итераторы и указатели к удалённым элементам и к элементам, идущим за ними, становятся нерабочими.
http:// ru.cppreference.com/w/cpp/container/vector/erase
> Итераторы и указатели к удалённым элементам и к элементам, идущим за ними, становятся нерабочими.
Владимир Егоров
а как лучше удалить с изменением длинны? или лучше использовать list?
Владимир Егоров
хотя они вроде как идентичны
Валентин Ли
это не геймдевру. тут цитаты не выделяются символом >
Похожие вопросы
- Алгоритмы стандартной библиотеки шаблонов. Вектора в C++.
- Работа с математическими векторами в программировании (Основы)
- Сортировка вектора обьектов класса по 1 из аттрибутов.
- Вот логотип нарисовал. Буду переводить в вектор. Оцените по 10 бальной шкале :)
- Что такое вектор и что должен содержать класс вектора? (С++)
- Паскаль! Даны векторы: a={xn}, b={yn}, c={zn}, d={dn}. Построить матрицу К, сторонами которой являются упорядочены в
- C++ Сортировка в сортировке вектора экземпляров структуры
- Векторы в Си
- Почему визитки обычно в векторе делают, а не в растре? зачем готовый растр переводят в вектор, объясните
- Adobe Illustrator перевод из растра в вектор без помощи трассировки, вручную. Как грамотно научиться?
теперь попробовал вычислить дистанцию между двумя итераторами, текущим и начальным.
получаю число и далее по стандартной схеме. удаляю элемент указывая неявный итератор и плюсую результат дистанции.. не могу понять на что он ругается... опять переписывать кусок кода....