Пространства имён
Варианты
Действия

std::data

Материал из cppreference.com
< cpp‎ | iterator
 
 
Библиотека итераторов
Концепты итераторов
Примитивы итераторов
Концепты алгоритмов и утилиты
Косвенно вызываемые концепты
Общие требования к алгоритмам
Утилиты
(C++20)
Адаптеры итераторов
Потоковые итераторы
Точки настройки итераторов
Операции итераторов
(C++11)
(C++11)
Доступ к диапазону
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
data
(C++17)
 
Определено в заголовочном файле <array>
Определено в заголовочном файле <deque>
Определено в заголовочном файле <forward_list>
Определено в заголовочном файле <iterator>
Определено в заголовочном файле <list>
Определено в заголовочном файле <map>
Определено в заголовочном файле <regex>
Определено в заголовочном файле <set>
Определено в заголовочном файле <span>
(начиная с C++20)
Определено в заголовочном файле <string>
Определено в заголовочном файле <string_view>
Определено в заголовочном файле <unordered_map>
Определено в заголовочном файле <unordered_set>
Определено в заголовочном файле <vector>
template <class C>
constexpr auto data(C& c) -> decltype(c.data());
(1) (начиная с C++17)
template <class C>
constexpr auto data(const C& c) -> decltype(c.data());
(2) (начиная с C++17)
template <class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept;
(3) (начиная с C++17)
template <class E>
constexpr const E* data(std::initializer_list<E> il) noexcept;
(4) (начиная с C++17)

Возвращает указатель на блок памяти, содержащий элементы диапазона.

1,2) возвращает c.data()
3) возвращает array
4) возвращает il.begin()

Содержание

[править] Параметры

c контейнер или представление с функцией-элементом data()
array массив произвольного типа
il список инициализаторов

[править] Возвращаемое значение

Указатель на блок памяти, содержащий элементы диапазона.

[править] Исключения

1) Может генерировать исключения, определённые реализацией.

[править] Примечание

Перегрузка для std::initializer_list необходима, так как у него нет функции-элемента data.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_nonmember_container_access 201411L (C++17) std::size(), std::data() и std::empty()

[править] Возможная реализация

Первая версия
template <class C> 
constexpr auto data(C& c) -> decltype(c.data())
{
    return c.data();
}
Вторая версия
template <class C> 
constexpr auto data(const C& c) -> decltype(c.data())
{
    return c.data();
}
Третья версия
template <class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept
{
    return array;
}
Четвёртая версия
template <class E> 
constexpr const E* data(std::initializer_list<E> il) noexcept
{
    return il.begin();
}

[править] Пример

#include <string>
#include <cstring>
#include <iostream>
 
int main()
{
    std::string s {"Привет мир!\n"};
 
    char a[20]; // хранилище для строки в стиле C
    std::strcpy(a, std::data(s));
    // [s.data(), s.data() + s.size()] гарантированно будет NTBS, начиная с C++11
 
    std::cout << a;
}

Вывод:

Привет мир!

[править] Смотрите также

получает указатель на начало непрерывного диапазона
(объект точки настройки) [править]
получает указатель на начало непрерывного диапазона, доступного только для чтения
(объект точки настройки) [править]