Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: end, std::map<Key,T,Compare,Allocator>:: cend

From cppreference.net

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

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

Этот возвращённый итератор действует только как sentinel. Не гарантируется, что он будет dereferenceable .

range-begin-end.svg

Содержание

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

Итератор за последним элементом.

Сложность

Константа.

Примечания

libc++ обратно портирует cend() в режим 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

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

возвращает итератор на начало
(public member function)
(C++11) (C++14)
возвращает итератор на конец контейнера или массива
(function template)