Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: begin, std::map<Key,T,Compare,Allocator>:: cbegin

From cppreference.net

iterator begin ( ) ;
(1) (noexcept начиная с C++11)
(constexpr начиная с C++26)
const_iterator begin ( ) const ;
(2) (noexcept начиная с C++11)
(constexpr начиная с C++26)
const_iterator cbegin ( ) const noexcept ;
(3) (начиная с C++11)
(constexpr начиная с C++26)

Возвращает итератор на первый элемент * this .

Если * this пуст, возвращаемый итератор будет равен end() .

range-begin-end.svg

Содержание

Возвращаемое значение

Итератор на первый элемент.

Сложность

Константа.

Примечания

libc++ переносит обратно cbegin() в режим C++98.

Пример

#include <iostream>
#include <map>
int main()
{
    std::map<int, float> num_map;
    num_map[4] = 4.13;
    num_map[9] = 9.24;
    num_map[1] = 1.09;
    // Вызывает num_map.begin() и num_map.end()
    for (auto it = num_map.begin(); it != num_map.end(); ++it)
        std::cout << it->first << ", " << it->second << '\n';
}

Вывод:

1, 1.09
4, 4.13
9, 9.24

Пример использования пользовательской функции сравнения

#include <cmath>
#include <iostream>
#include <map>
struct Point { double x, y; };
// Сравнение x-координат двух указателей на Point.
struct PointCmp
{
    bool operator()(const Point* lhs, const Point* rhs) const
    {
        return lhs->x < rhs->x; 
    }
};
int main()
{
    // Обратите внимание, что хотя x-координаты не упорядочены,
    // итерация по map будет выполняться по возрастанию x-координат.
    Point points[3] = {{2, 0}, {1, 0}, {3, 0}};
    // mag - это map, связывающая адрес узла с его величиной в плоскости x-y.
    // Хотя ключи являются указателями на Point, мы хотим упорядочить map по
    // x-координатам точек, а НЕ по адресам Point. Это достигается
    // использованием метода сравнения класса PointCmp.
    std::map<Point*, double, PointCmp> mag(
        {{points, 2}, {points + 1, 1}, {points + 2, 3}}
    );
    // Изменяем каждую y-координату с 0 на величину.
    for (auto iter = mag.begin(); iter != mag.end(); ++iter)
    {
        auto cur = iter->first; // Указатель на Node
        cur->y = mag[cur]; // Можно было также использовать cur->y = iter->second;
    }
    // Обновляем и выводим величину каждого узла.
    for (auto iter = mag.begin(); iter != mag.end(); ++iter)
    {
        auto cur = iter->first;
        mag[cur] = std::hypot(cur->x, cur->y);
        std::cout << "The magnitude of (" << cur->x << ", " << cur->y << ") is ";
        std::cout << iter->second << '\n';
    }
    // Повторяем вышеописанное с использованием range-based for loop.
    for (auto i : mag)
    {
        auto cur = i.first;
        cur->y = i.second;
        mag[cur] = std::hypot(cur->x, cur->y);
        std::cout << "The magnitude of (" << cur->x << ", " << cur->y << ") is ";
        std::cout << mag[cur] << '\n';
        // В отличие от std::cout << iter->second << '\n'; выше,
        // std::cout << i.second << '\n'; НЕ выведет обновленную величину.
        // Если бы использовалось auto &i : mag, это вывело бы обновленную величину.
    }
}

Вывод:

The magnitude of (1, 1) is 1.41421
The magnitude of (2, 2) is 2.82843
The magnitude of (3, 3) is 4.24264
The magnitude of (1, 1.41421) is 1.73205
The magnitude of (2, 2.82843) is 3.4641
The magnitude of (3, 4.24264) is 5.19615

Смотрите также

(C++11)
возвращает итератор на конец
(публичная функция-член)
(C++11) (C++14)
возвращает итератор на начало контейнера или массива
(шаблон функции)