Namespaces
Variants

std:: data

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
data
(C++17)
Definiert in Header <array>
Definiert in Header <deque>
Definiert in Header <flat_map>
Definiert in Header <flat_set>
Definiert in Header <forward_list>
Definiert in Header <inplace_vector>
Definiert in Header <iterator>
Definiert in Header <list>
Definiert in Header <map>
Definiert in Header <regex>
Definiert in Header <set>
Definiert in Header <span>
Definiert in Header <string>
Definiert in Header <string_view>
Definiert in Header <unordered_map>
Definiert in Header <unordered_set>
Definiert in Header <vector>
template < class C >
constexpr auto data ( C & c ) - > decltype ( c. data ( ) ) ;
(1) (seit C++17)
template < class C >
constexpr auto data ( const C & c ) - > decltype ( c. data ( ) ) ;
(2) (seit C++17)
template < class T, std:: size_t N >
constexpr T * data ( T ( & array ) [ N ] ) noexcept ;
(3) (seit C++17)
template < class E >
constexpr const E * data ( std:: initializer_list < E > il ) noexcept ;
(4) (seit C++17)

Gibt einen Zeiger auf den Speicherblock zurück, der die Elemente des Bereichs enthält.

1,2) Gibt c. data ( ) zurück.
3) Gibt array zurück.
4) Gibt il. begin ( ) zurück.

Inhaltsverzeichnis

Parameter

c - ein Container oder View mit einer data ( ) Member-Funktion
array - ein Array beliebigen Typs
il - eine std::initializer_list

Rückgabewert

1,2) c. data ( )
3) array
4) il. begin ( )

Exceptions

1) Kann implementierungsdefinierte Ausnahmen werfen.

Hinweise

Die Überladung für std::initializer_list ist notwendig, da sie keine Memberfunktion data besitzt.

Feature-Test Makro Wert Std Funktion
__cpp_lib_nonmember_container_access 201411L (C++17) std::size() , std::data() und std::empty()

Mögliche Implementierung

Erste Version
template<class C>
constexpr auto data(C& c) -> decltype(c.data())
{
    return c.data();
}
Zweite Version
template<class C>
constexpr auto data(const C& c) -> decltype(c.data())
{
    return c.data();
}
Dritte Version
template<class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept
{
    return array;
}
Vierte Version
template<class E>
constexpr const E* data(std::initializer_list<E> il) noexcept
{
    return il.begin();
}

Beispiel

#include <cstring>
#include <iostream>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // Speicher für einen C-String
    std::strcpy(a, std::data(s));
//  [s.data(), s.data() + s.size()] ist garantiert ein NTBS seit C++11
    std::cout << a;
}

Ausgabe:

Hello world!

Siehe auch

erhält einen Zeiger auf den Anfang eines zusammenhängenden Bereichs
(Anpassungspunktobjekt)
erhält einen Zeiger auf den Anfang eines schreibgeschützten zusammenhängenden Bereichs
(Anpassungspunktobjekt)