@einpoklum ma całkiem niezłą robotę, przedstawiając to, co spanjest w swojej odpowiedzi tutaj . Jednak nawet po przeczytaniu jego odpowiedzi łatwo jest komuś nowemu, aby nadal miał sekwencję pytań, na które nie ma pełnej odpowiedzi, na przykład:
- Czym
spanróżni się od tablicy C? Dlaczego nie skorzystać z jednego z nich? Wygląda na to, że to tylko jeden ze znanych rozmiarów ...
- Czekaj, to brzmi jak
std::array, czym się spanróżni od tego?
- Och, to przypomina mi, nie jest
std::vectorniczym std::arrayzbyt?
- Jestem zmieszany. :( Co to jest
span?
Oto kilka dodatkowych wyjaśnień na ten temat:
BEZPOŚREDNI WYCENA JEGO ODPOWIEDZI - Z MOIMMI DODATKAMI :
Co to jest?
A span<T>to:
- Bardzo lekka abstrakcja ciągłej sekwencji wartości typu
Tgdzieś w pamięci.
- Zasadniczo pojedyncza struktura
{ T * ptr; std::size_t length; }z wieloma wygodnymi metodami. (Zauważ, że różni się to wyraźnie od tego, std::array<>że spanumożliwia metody akcesorium wygodnego, porównywalne do std::array, za pomocą wskaźnika do typuT i długości (liczby elementów) typu T, podczas gdy std::arrayjest faktycznym pojemnikiem, który zawiera jedną lub więcej wartości typu T).
- Typ niebędący właścicielem (tj. „Typ odniesienia” zamiast „typ wartości”): nigdy nie przydziela ani nie zwalnia niczego i nie utrzymuje inteligentnych wskaźników.
Wcześniej był znany jako, array_viewa jeszcze wcześniej jako array_ref.
Te odważne części są kluczowe dla zrozumienia, więc nie przegap ich ani nie odczytaj ich źle! A spanNIE jest tablicą C struktur, ani nie jest strukturą typu C Tpowiększoną o długość tablicy (byłby to w zasadzie std::array kontener ), NOR jest to tablica C struktur wskaźników pisać Tplus długość, ale raczej jest to pojedyncza struktura zawierająca pojedynczy wskaźnik do pisaniaT oraz długość , która jest liczbą elementów (typu T) w ciągłym bloku pamięci, na który Twskazuje wskaźnik do pisania ! W ten sposób jedyny narzut dodany przy użyciuspanto zmienne do przechowywania wskaźnika i długości oraz wszelkie używane funkcje akcesoriów, które spanudostępnia.
Jest to w przeciwieństwie do std::array<>, ponieważ std::array<>rzeczywiście alokuje pamięć dla całego ciągły blok, a to jest podobna std::vector<>, ponieważ std::vectorjest w zasadzie tylko std::array, że również ma dynamiczny rośnie (zazwyczaj podwojenie wielkości) za każdym razem zapełnia się i spróbować dodać coś jeszcze do niego . A std::arrayma stały rozmiar, a a spannawet nie zarządza pamięcią bloku, na który wskazuje, po prostu wskazuje blok pamięci, wie, jak długi jest blok pamięci, wie, jaki typ danych znajduje się w macierzy C. w pamięci i zapewnia dodatkowe funkcje akcesorium do pracy z elementami w tej ciągłej pamięci .
To jest część C ++ standard:
std::spanjest częścią standardu C ++ od C ++ 20. Możesz przeczytać jego dokumentację tutaj: https://en.cppreference.com/w/cpp/container/span . Aby zobaczyć, jak korzystać z Google absl::Span<T>(array, length)w C ++ 11 lub później dzisiaj , patrz poniżej.
Opisy podsumowań i najważniejsze odniesienia:
std::span<T, Extent>( Extent= "liczba elementów w sekwencji lub std::dynamic_extentdynamiczna". Rozpiętość wskazuje tylko na pamięć i ułatwia dostęp, ale NIE zarządza nią!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>(zauważ, że ma ustalony rozmiar N!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T> (automatycznie dynamicznie rośnie w miarę potrzeb):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
Jak mogę użyć spanw C ++ 11 lub później dzisiaj ?
Google ma otwarte źródła wewnętrznych bibliotek C ++ 11 w formie biblioteki „Abseil”. Ta biblioteka ma na celu dostarczanie funkcji od C ++ 14 do C ++ 20 i innych, które działają w C ++ 11 i późniejszych, abyś mógł dziś korzystać z funkcji jutra. Mówią:
Zgodność ze standardem C ++
Google opracował wiele abstrakcji, które pasują lub ściśle pasują do funkcji zawartych w C ++ 14, C ++ 17 i innych. Korzystanie z wersji Abseil tych abstrakcji umożliwia teraz dostęp do tych funkcji, nawet jeśli kod nie jest jeszcze gotowy do życia w świecie post C ++ 11.
Oto niektóre kluczowe zasoby i linki:
- Strona główna: https://abseil.io/
- https://abseil.io/docs/cpp/
- Repozytorium GitHub: https://github.com/abseil/abseil-cpp
span.hnagłówek i absl::Span<T>(array, length)klasa szablonów: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::spanzostał zaproponowany w 2017 r. Dotyczy C ++ 17 lub C ++ 20. Zobacz także P0122R5, span: bezpieczne widoki dla sekwencji obiektów . Czy naprawdę chcesz kierować na ten język? Miną lata, zanim kompilatory nadrobią zaległości.