Поскольку вы можете "расширять" вектор только с помощью его открытого интерфейса, гораздо полезнее писать функции, которые работают с вектором, а не являются частью вектора.
Черт, если вы все спланируете хорошо, сделайте так, чтобы он работал с итераторами, а не с индексами, и он будет работать не только с std::vector
(см. <algorithm>
для некоторых очень хороших примеров).
Например, вы можете использовать функтор для MaxA следующим образом:
struct CmpA {
bool operator()(const Item &item1, const Item &item2) { return item1.a < item2.a; }
}
const int result = std::max_element(v.begin(), v.end(), CmpA()).a;
ваш specialB может быть таким же простым с функтором и std::accumulate
РЕДАКТИРОВАТЬ: или для c ++ 11 и более поздних версий, это может быть так просто, как:
const int result = std::max_element(v.begin(), v.end(), [](const Item &item1, const Item &item2) {
return item1.a < item2.a;
}).a;
РЕДАКТИРОВАТЬ: вы спросили, почему это лучше сделать так:
если вы используете алгоритмы, шаблоны и итераторы, это будет работать, даже если вы решите поместить элементы в std::list<Item>
или что-то еще. Он просто более универсален и помогает многократно использовать код.
Плюс функции из <algorithm>
делают для вас многое из этого, так что вы можете просто использовать маленькие функторы с 3 линейными адаптерами.
РЕДАКТИРОВАТЬ: В дополнение к этому, tgamblin перечислил несколько очень убедительных причин не наследовать от std::vector
(и большинства других контейнеров std, включая std::string
).