Вы ищете код-обзор?
Есть несколько вещей, которые я бы исправил там.
- Имеет ли A какую-либо цель, кроме форматирования печати для массива B? Живет ли Б собственное существование? Если это так, пусть A содержит константную ссылку на вектор B, а не копирует его.
Аналогично B как совокупность C, хотя здесь это должен быть указатель на вектор, а не ссылка, поскольку B должен быть назначаем, чтобы находиться в векторе (в отличие от A, который сам не является элементом вектора).
Вы можете использовать алгоритм для цикла или BOOST_FOREACH. В любом случае ваша циклическая конструкция не самая лучшая. Чуть лучше использовать итераторы. Если вы используете индексы, то size_t или vector :: size_type в качестве индекса. Лучше рассчитать size () один раз за пределами цикла или в первой части, например, для
for( std::vector<B>::size_type i = 0, len = v.size(); i != len; ++i )
Не использовать в (). Вы знаете, что ваши индексы не выходят за пределы. Предпочитайте оператор [], если вам нужно использовать эту конструкцию.
Ни filterA, ни filterB не изменяют свои классы, поэтому делают их постоянными функциями-членами.
Потоковая передача пустых строк - просто бессмысленный код. Одно дело, если у вас есть строковая переменная, которая может быть пустой, но os << ""
ничего не достигает.