C++20's std::span
If you are able to use C++20, you could use std::span
which is a pointer - length pair that gives the user a view into a contiguous sequence of elements. It is some sort of a std::string_view
, and while both std::span
and std::string_view
are non-owning views, std::string_view
is a read-only view.
From the docs:
The class template span describes an object that can refer to a
contiguous sequence of objects with the first element of the sequence
at position zero. A span can either have a static extent, in which
case the number of elements in the sequence is known and encoded in
the type, or a dynamic extent.
So the following would work:
#include <span>
#include <iostream>
#include <algorithm>
int main() {
int data[] = { 5, 3, 2, 1, 4 };
std::span<int> s{data, 5};
std::sort(s.begin(), s.end());
for (auto const i : s) {
std::cout << i << "
";
}
return 0;
}
Check it out live
Since std::span
is basically pointer - length pair, you can use in a following manner too:
size_t size = 0;
int *data = get_data_from_library(size);
std::span<int> s{data, size};
Note: Not all compilers support std::span
. Check compiler support here.
UPDATE
If you are not able to use C++20, you could use gsl::span
which is basically the base version of the C++ standard's std::span
.
C++11 solution
If you are limited to C++11 standard, you can try implementing your own simple span
class:
template<typename T>
class span {
T* ptr_;
std::size_t len_;
public:
span(T* ptr, std::size_t len) noexcept
: ptr_{ptr}, len_{len}
{}
T& operator[](int i) noexcept {
return *ptr_[i];
}
T const& operator[](int i) const noexcept {
return *ptr_[i];
}
std::size_t size() const noexcept {
return len_;
}
T* begin() noexcept {
return ptr_;
}
T* end() noexcept {
return ptr_ + len_;
}
};
Check out C++11 version live
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…