Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Список эффективен, если необходимо удалять из середины (или вставлять в середину)
- быстро и не инвалидируя итераторы
- Итераторы списка имеют категорию bidirectional (двунаправленные)
- На практике списки нужны редко
- Еще реже нужен контейнер forward_list - список, позволяющий итерироваться только вперед
- #include <iostream>
- #include <algorithm>
- #include <list>
- #include <vector>
- using namespace std;
- class NumbersOnVector
- {
- public:
- void Add(int x)
- {
- data.push_back(x);
- }
- template<typename Predicate>
- void Remove(Predicate predicate)
- {
- data.erase(
- remove_if(begin(data),end(data),predicate),
- data.end());
- }
- private:
- vector<int> data;
- };
- class NumbersOnList
- {
- public:
- void Add(int x)
- {
- data.push_back(x);
- }
- template<typename Predicate>
- void Remove(Predicate predicate)
- {
- data.remove_if(predicate);
- }
- private:
- list<int> data;
- };
- const int SIZE = 1000000;
- const int REMOVAL_COUNT = 10;
- int main()
- {
- {
- //LOG_DURATION("vector");
- NumbersOnVector numbers;
- for (int i = 0; i < SIZE; ++i)
- {
- numbers.Add(i);
- }
- for(int i=0;i<REMOVAL_COUNT;++i)
- {
- numbers.Remove([i](int x){return x%REMOVAL_COUNT==i;});
- }
- }
- {
- //LOG_DURATION("list");
- NumbersOnList numbers;
- for (int i = 0; i < SIZE; ++i)
- {
- numbers.Add(i);
- }
- for(int i=0;i<REMOVAL_COUNT;++i)
- {
- numbers.Remove([i](int x){return x%REMOVAL_COUNT==i;});
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement