Нигде не могу найти описание функций begin() и end(), для чего они нужны?
Если можно напишите пример пожалуйста :)
Итератор, указывающий на первый элемент в контейнере, и за последний элемент.
int a[] = {1,2,3,4,5};
for(auto i = begin(a); i != end(a); ++i)
cout << *i << endl;
Примерно так. Если вы о свободных функциях.
Функции-члены делают то же самое:
vector<int> a {1,2,3,4,5};
for(auto i = a.begin(); i != a.end(); ++i)
cout << *i << endl;
Шаблоны функций std::begin и std::end просто вызывают методы begin() и end() у своего аргумента и возвращают полученный результат. Но при этом они специализированы особым образом для аргументов типа "массив": std::begin возвращает указатель на начало массива, а std::end указатель на воображаемый элемент за концом массива.
Эти функции предназначены для унификации интерфейса между стандартными контейнерами, обыкновенными массивами и std::initializer_list. Начиная с С++17 в этот комплект также входят шаблоны функции std::data, std::size и std::empty, служащие аналогичным целям и реализованные аналогичным образом.
Пользуясь этими функциями вы можете писать унифицированный generic шаблонный код, который сможет работать как со стандартными контейнерами, так и с обычными массивами, и с std::initializer_list без необходимости вручную писать специализированные версии для этих особых случаев
template <typename T> void print(const T &c)
{
if (!std::empty(c))
{
std::cout << "Size: " << std::size(c) << std::endl;
for (auto it = std::begin(c); it != std::end(c); ++it)
std::cout << *it << " ";
std::cout << std::endl;
}
}
int main()
{
int a[] = { 1, 2, 3 };
print(a);
std::list<double> l = { 5, 6, 7, 8 };
print(l);
auto il = { "10", "11", "12", "13", "14" };
print(il);
}
За пределами generic кода необходимости в использовании этих функций нет, но использовать их по-прежнему можно и иногда даже весьма удобно.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости