Обычно вы делаете:
std::vector<int> vec;
std::some_algorithm(vec.begin(), vec.end(), ...);
Теперь представьте, vector
хранит размер вектора. Тогда давайте предположим, что это реализовано следующим образом:
// in #include <vector>
namespace std {
template<typename T>
class vector {
T *_Begin; // pointer to beginning of allocated space
size_t _Size; // size of allocated space
T* begin() { return _Begin; }
T* end() { return _Begin + _Size; }
};
...
}
Затем std::some_algorithm
может быть встроено в:
std::some_algorithm(vec._Begin, vec._Begin + vec._Size, ...);
Если нашим приоритетом является размер объекта, мы бы решили сохранить либо указатель конца, либо количество объектов в векторе. Когда мы храним количество объектов, мы должны вычислить указатель end()
путем сложения, и мы можем вернуть size()
непосредственно. Когда мы сохраним указатель конца, тогда end()
будет простым возвратом, а size()
должен быть рассчитан из разности указателей и деления на размер объекта.
Скорее всего, разработчики библиотек решат оптимизировать вычисления для end()
, а не для size()
. Поскольку алгоритмы C ++ основаны на использовании двух указателей - начального и конечного итератора, разумно (для меня) предположить, что конечный указатель будет использоваться гораздо чаще, чем size.