Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Memberikan tampilan ringan atas urutan objek yang berdampingan. menyediakan span cara yang aman untuk melakukan iterasi dan indeks ke dalam objek yang diatur kembali ke belakang dalam memori. Seperti objek yang disimpan dalam array bawaan, , std::arrayatau std::vector.
Jika Anda biasanya mengakses urutan objek back-to-back menggunakan pointer dan indeks, span adalah alternatif yang lebih aman dan ringan.
Ukuran span dapat diatur pada waktu kompilasi dengan menentukannya sebagai argumen templat, atau pada runtime dengan menentukan dynamic_extent.
Sintaks
template<class T, size_t Extent = dynamic_extent>
class span;
Parameter template
T
Jenis elemen dalam span.
Extent
Jumlah elemen dalam span jika ditentukan pada waktu kompilasi. Jika tidak std::dynamic_extent , jika jumlah elemen akan ditentukan pada run-time.
Anggota
| Definisi Jenis | Keterangan |
|---|---|
const_pointer |
Jenis penunjuk ke const elemen. |
const_reference |
Jenis referensi ke const elemen. |
difference_type |
Jenis jarak yang ditandatangani antara dua elemen. |
element_type |
Jenis span elemen. |
iterator |
Jenis iterator untuk span. |
pointer |
Jenis penunjuk ke elemen. |
reference |
Jenis referensi ke elemen. |
reverse_iterator |
Jenis iterator terbalik untuk span. |
size_type |
Jenis untuk hasil jarak yang tidak ditandatangani antara dua elemen dalam span. |
value_type |
Jenis elemen, tanpa const atau volatile kualifikasi. |
| Pembangun | Keterangan |
span |
spanBuat . |
| Dukungan iterator | Keterangan |
begin |
Dapatkan iterator yang menunjuk ke elemen pertama di span. |
end |
Dapatkan iterator yang menunjuk ke akhir span. |
rbegin |
Dapatkan iterator terbalik yang menunjuk ke elemen spanterakhir ; yaitu, awal terbalik span. |
rend |
Dapatkan iterator terbalik yang menunjuk ke depan span; yaitu, akhir dari terbalik span. |
| Elemen Access | Keterangan |
back |
Dapatkan elemen terakhir di span. |
data |
Dapatkan alamat elemen pertama di span. |
front |
Dapatkan elemen pertama di span. |
operator[] |
Akses elemen pada posisi tertentu. |
| Pengamat | Keterangan |
empty |
Uji apakah span kosong. |
size |
Dapatkan jumlah elemen di span. |
size_bytes |
Dapatkan ukuran span dalam byte. |
| Sub-gambaran | Keterangan |
first |
Dapatkan subspan dari depan span. |
last |
Dapatkan subspan dari bagian spanbelakang . |
subspan |
Dapatkan subspan dari mana saja di span. |
| Operator | Keterangan |
span::operator= |
spanGanti . |
span::operator[] |
Dapatkan elemen pada posisi yang ditentukan. |
Keterangan
Semua span fungsi anggota memiliki kompleksitas waktu yang konstan.
Tidak seperti array atau vector, span tidak "memiliki" elemen di dalamnya. span Tidak membebaskan penyimpanan apa pun untuk item di dalamnya karena tidak memiliki penyimpanan untuk objek tersebut.
Persyaratan
Header: <span> (sejak C++20)
kumpulan nama XML: std
Opsi Pengkompilasi: /std:c++20 atau yang lebih baru diperlukan.
span::back
Dapatkan elemen terakhir di span.
constexpr reference back() const noexcept;
Nilai hasil
Referensi ke elemen terakhir di span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.back();
}
2
span::begin
Dapatkan iterator yang menunjuk pada elemen pertama di span.
constexpr iterator begin() const noexcept;
Nilai hasil
Iterator yang menunjuk pada elemen pertama di span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.begin();
cout << *i;
}
0
span::data
Dapatkan penunjuk ke awal span data.
constexpr pointer data() const noexcept;
Nilai hasil
Penunjuk ke item pertama yang disimpan di span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.data();
cout << *i;
}
0
span::difference_type
Jumlah elemen antara dua elemen dalam .span
using difference_type = std::ptrdiff_t;
Contoh
#include <span>
#include <iostream>
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::difference_type distance = mySpan.end() - mySpan.begin();
cout << distance << std::endl;
}
3
span::element_type
Jenis elemen dalam span.
using element_type = T;
Keterangan
Jenis diambil dari parameter T templat saat span dibuat.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::element_type et = mySpan[2];
cout << et << endl;
}
2
span::empty
span Apakah berisi elemen.
constexpr bool empty() const noexcept;
Nilai hasil
Mengembalikan true jika this->size() == 0. Jika tidak false, .
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
bool isEmpty = mySpan.empty(); // isEmpty == false
}
span::end
Dapatkan iterator ke akhir span.
constexpr iterator end() const noexcept;
Nilai hasil
Iterator yang menunjuk tepat di luar akhir span.
Keterangan
end digunakan untuk menguji apakah iterator telah melewati akhir rentangnya.
Jangan dereferensikan nilai yang dikembalikan oleh iterator ini. Gunakan untuk mengidentifikasi apakah iterator telah mencapai melampaui elemen terakhir di span.
Contoh
// Iteration
for (auto it = s1.begin(); it != s1.end(); ++it)
{
cout << *it;
}
span::first
Dapatkan subspan, diambil dari depan ini span.
constexpr auto first(size_type count) const noexcept;
template <size_t count> constexpr auto first() const noexcept;
Parameter
count
Jumlah elemen dari depan ini span untuk dimasukkan ke dalam subspan.
Jumlah elemen ditentukan sebagai parameter ke templat, atau ke fungsi, seperti yang diilustrasikan di bawah ini.
Nilai hasil
span yang berisi count elemen dari depan ini span.
Keterangan
Gunakan versi templat fungsi ini jika memungkinkan untuk memvalidasi pada waktu kompilasi count , dan untuk mempertahankan info tentang span karena mengembalikan span tingkat tetap.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto first2 = mySpan.first(2);
cout << "mySpan.first(2): ";
for (auto& i : first2)
{
cout << i;
}
cout << "\nmySpan.first<2>: ";
auto viewSpan = mySpan.first<2>();
for (auto& i : viewSpan)
{
cout << i;
}
}
mySpan.first(2): 01
mySpan.first<2>: 01
span::front
Dapatkan elemen pertama di span.
constexpr reference front() const noexcept;
Nilai hasil
Referensi ke elemen pertama di span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.front();
cout << i;
}
0
span::iterator
Jenis elemen over iterator span .
using iterator = implementation-defined-iterator-type;
Keterangan
Jenis ini berfungsi sebagai iterator lebih dari elemen dalam span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::iterator it = mySpan.begin();
cout << *it++ << *it++ << *it;
}
012
span::last
Dapatkan subspan, diambil dari akhir ini span.
constexpr span<element_type, dynamic_extent> last(const size_type count) const noexcept;
template <size_t count> constexpr span<element_type, count> last() const noexcept;
Parameter
count
Jumlah elemen dari akhir ini span untuk dimasukkan ke dalam subspan.
Angka dapat ditentukan sebagai parameter ke templat, atau ke fungsi, seperti yang diilustrasikan di bawah ini.
Nilai hasil
Yang span berisi elemen terakhir count dari ini span.
Keterangan
Gunakan versi templat fungsi ini jika memungkinkan untuk memvalidasi pada waktu kompilasi count , dan untuk mempertahankan info tentang span karena mengembalikan span tingkat tetap.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto first2 = mySpan.last(2);
cout << "mySpan.last(2): ";
for (auto& i : last2)
{
cout << i;
}
cout << "\nmySpan.last<2>: ";
auto viewSpan = mySpan.last<2>();
for (auto& i : viewSpan)
{
cout << i;
}
}
mySpan.last(2): 12
mySpan.last<2>: 12
span::operator[]
Dapatkan elemen pada span posisi yang ditentukan.
constexpr reference operator[](size_type offset) const;
Parameter
offset
Elemen berbasis nol dalam span akses ke.
Nilai hasil
Referensi ke elemen pada posisi offset. Jika posisi tidak valid, perilaku tidak terdefinisi.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan[1];
}
1
span::operator=
Tetapkan yang lain span untuk yang satu ini.
constexpr span& operator=(const span& other) noexcept = default;
Parameter
other
yang span akan ditetapkan untuk yang satu ini.
Nilai hasil
*this
Keterangan
Penugasan melakukan salinan pointer data dangkal dan ukurannya. Salinan dangkal aman karena span tidak mengalokasikan memori untuk elemen yang dikandungnya.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int> mySpan2;
mySpan2 = mySpan;
for (auto &i : mySpan2)
{
cout << it;
}
}
012
span::pointer
Jenis untuk penunjuk, dan const penunjuk, ke span elemen.
using pointer = T*;
using const_pointer = const T*;
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
// pointer
span<int>::pointer ptr = &mySpan[2];
*ptr = 9;
cout << mySpan[2];
// const pointer
span<int>::const_pointer cPtr = &mySpan[0];
// *cPtr = 9; error - const
cout << *cPtr;
}
90
span::rbegin
Dapatkan iterator terbalik yang menunjuk ke elemen terakhir dari ini span.
constexpr reverse_iterator rbegin() const noexcept;
Nilai hasil
Iterator yang menunjuk ke awal terbalik span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
{
cout << *rIt;
}
}
210
span::reference
Jenis untuk referensi, dan const referensi, ke span elemen.
using reference = T&;
using const_reference = const T&;
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
// reference
span<int>::reference ref = mySpan[0];
ref = 9;
cout << mySpan[0];
// const reference
span<int>::const_reference cRef = mySpan[1];
// cRef = 9; error because const
cout << cRef;
}
91
span::rend
Dapatkan iterator akses acak yang menunjuk tepat di luar akhir terbalik span.
constexpr reverse_iterator rend() const noexcept;
Nilai hasil
Iterator terbalik ke tempat penampung mengikuti elemen terakhir dalam terbalik span; yaitu, tempat penampung sebelum elemen pertama dalam yang tidak terbalik span.
Keterangan
rend digunakan dengan terbalik span seperti span::end yang digunakan dengan span. Gunakan untuk menguji apakah iterator terbalik telah mencapai akhir span.
Nilai yang dikembalikan oleh rend tidak boleh didereferensikan.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
{
cout << *rIt;
}
}
span::reverse_iterator
Jenis iterator terbalik untuk span.
using reverse_iterator = std::reverse_iterator<iterator>;
Contoh
#include <span>
#include <iostream>
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::reverse_iterator rIt = mySpan.rbegin();
cout << *rIt++ << *rIt++ << *rIt;
}
210
span::size
Dapatkan jumlah elemen di span.
constexpr size_t size() const noexcept;
Nilai hasil
Jumlah elemen dalam span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.size();
}
3
span::size_bytes
Dapatkan ukuran elemen dalam span byte.
constexpr size_type size_bytes() const noexcept;
Nilai hasil
Jumlah byte yang ditempati span semua elemen; yaitu, sizeof(element_type) dikalikan dengan jumlah elemen dalam span.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.size_bytes(); // 3 elements * 4 (size of an int)
}
12
span::size_type
Jenis yang tidak ditandatangani, cocok untuk menyimpan jumlah elemen dalam span.
using size_type = size_t;
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::size_type szType = mySpan.size();
cout << szType;
}
3
span::span
span Konstruktor.
constexpr span() noexcept
requires (Extent == 0 || Extent == dynamic_extent) = default;
template <class It>
constexpr explicit(Extent != dynamic_extent)
span(It first, size_type count) noexcept
template <class It, class End>
constexpr explicit(Extent != dynamic_extent)
span(It first, End last) noexcept(noexcept(last - first))
template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<T (*)[], T (*)[]>
constexpr span(array<T, N>& arr) noexcept
template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<const T (*)[], T (*)[]>
constexpr span(const array<T, N>& arr) noexcept
template <size_t N>
requires (Extent == dynamic_extent || Extent == N)
constexpr span(type_identity_t<T> (&arr)[N]) noexcept
template <class R>
constexpr explicit(Extent != dynamic_extent)
span(R&& r)
// default copy ctor
constexpr span(const span& other) noexcept = default;
// converting ctor
template <class T, size_t OtherExtent>
requires (Extent == dynamic_extent || OtherExtent == dynamic_extent ||
Extent == OtherExtent) && is_convertible_v<T (*)[], T (*)[]>
constexpr explicit(Extent != dynamic_extent && OtherExtent == dynamic_extent)
span(const span<T, OtherExtent>& other) noexcept
Parameter
arr
Buat span dari array.
count
Jumlah elemen yang akan berada di span.
first
Iterator ke elemen pertama dalam span.
last
Iterator untuk hanya melewati elemen terakhir di span.
N
Jumlah elemen yang akan berada di span.
other
Buat salinan ini span.
r
Buat span dari rentang R.
Keterangan
span Tidak membebaskan penyimpanan untuk item di span karena tidak memiliki penyimpanan objek di dalamnya.
| Konstruktor | Deskripsi |
|---|---|
span() |
Buat kosong span. Hanya dipertimbangkan selama resolusi kelebihan beban saat parameter Extent templat adalah 0 atau dynamic_extent. |
span(It first, size_type count) |
Buat span dari elemen pertama count dari iterator first. Hanya dipertimbangkan selama resolusi kelebihan beban saat parameter Extent templat bukan dynamic_extent. |
span(It first, End last) |
Buat span dari elemen di iterator first hingga akhir last tercapai. Hanya dipertimbangkan selama resolusi kelebihan beban saat parameter Extent templat bukan dynamic_extent. It harus berupa contiguous_iterator. |
span(array<T, N>& arr) noexcept;span(const array<T, N>& arr) noexcept;span(type_identity_t<element_type> (&arr)[N]) noexcept; |
Buat span dari N elemen array yang ditentukan. Hanya dipertimbangkan selama resolusi kelebihan beban ketika parameter Extent templat atau dynamic_extent sama dengan N. |
span(R&& r) |
Buat span dari rentang. Hanya berpartisipasi dalam resolusi kelebihan beban jika parameter Extent templat bukan dynamic_extent. |
span(const span& other) |
Konstruktor salinan yang dihasilkan kompilator. Salinan pointer data yang dangkal aman karena span tidak mengalokasikan memori untuk menahan elemen. |
span(const span<OtherElementType, OtherExtent>& s) noexcept; |
Mengonversi konstruktor: membangun span dari konstruktor lain span. Hanya berpartisipasi dalam resolusi kelebihan beban jika parameter Extent templat adalah dynamic_extent, atau N dynamic_extent atau sama dengan Extent. |
Contoh
#include <span>
using namespace std;
int main()
{
const int MAX=10;
int x[MAX];
for (int i = 0; i < MAX; i++)
{
x[i] = i;
}
span<int, MAX> span1{ x }; // fixed-size span: compiler error if size of x doesn't match template argument MAX
span<int> span2{ x }; // size is inferred from x
span<const int> span3 = span2; // converting constructor
span<int> span4( span2 ); // copy constructor
}
span::subspan
Dapatkan subspan dari ini span.
constexpr auto subspan(size_type offset, size_type count = dynamic_extent) const noexcept;
template <size_t offset, size_t count = dynamic_extent>
constexpr auto subspan() const noexcept
Parameter
count
Jumlah elemen yang akan dimasukkan ke dalam subspan. Jika count adalah dynamic_extent (nilai default), maka subspan diambil dari offset ke akhir ini span.
offset
Lokasi dalam hal ini span untuk memulai subspan.
Nilai hasil
Mulai span dari offset dalam ini span. Berisi count elemen.
Keterangan
Versi templat dari fungsi ini tersedia yang memeriksa jumlah pada waktu kompilasi, yang mempertahankan informasi tentang span dengan mengembalikan span tingkat tetap.
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << "mySpan.subspan(1,2): ";
for (auto& i : mySpan.subspan(1,2))
{
cout << i;
}
cout << "\nmySpan.subspan<1,2>: ";
for (auto& i : mySpan.subspan<1,2>())
{
cout << i;
}
cout << "\nmySpan.subspan<1>: ";
for (auto& i : mySpan.subspan<1>)
{
cout << i;
}
}
mySpan.subspan(1,2): 12
mySpan.subspan<1,2>: 12
mySpan.subspan<1>: 12
span::value_type
Jenis elemen dalam span, tanpa const atau volatile kualifikasi.
using value_type = std::remove_cv_t<T>;
Contoh
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::value_type vType = mySpan[2];
cout << vType;
}
2
Panduan pengurangan
Panduan pengurangan berikut disediakan untuk span.
// Allows the extent to be deduced from std::array and C++ built-in arrays
template <class T, size_t Extent>
span(T (&)[Extent]) -> span<T, Extent>;
template <class T, size_t Size>
span(array<T, Size>&) -> span<T, Size>;
template <class T, size_t Size>
span(const array<T, Size>&) -> span<const T, Size>;
// Allows the element type to be deduced from the iterator and the end of the span.
// The iterator must be contiguous
template <contiguous_iterator It, class End>
span(It, End) -> span<remove_reference_t<iter_reference_t<It>>>;
// Allows the element type to be deduced from a range.
// The range must be contiguous
template <ranges::contiguous_range Rng>
span(Rng &&) -> span<remove_reference_t<ranges::range_reference_t<Rng>>>;