#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>

struct A
{
    A(std::initializer_list<int> il) : _values(il) {}

    std::vector<int>& get_values() { return _values; }

private:
    std::vector<int> _values;
};

struct B
{
    B(A* a) : _a(a) {}

    void apply_filter(std::function<bool(int)> filter)
    {
        std::vector<int>& v = _a->get_values();

        v.erase(std::remove_if(v.begin(), v.end(), filter), v.end());
    }

private:
    A* _a;
};

void print(const std::vector<int>& v)
{
    std::cout << "{ ";
    for (auto e : v)
        std::cout << e << ' ';
    std::cout << "}\n";
}

int main()
{
    A a({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
    print(a.get_values());

    B b(&a);
    b.apply_filter([](int val) { return val % 2 == 0; });

    print(a.get_values());
}