C ++ 20-х std::span
Если вы можете использовать C ++ 20, вы можете использовать std::span
, который является парой указатель-длина, которая дает пользователю взгляд на непрерывную последовательность элементов. Это своего рода std::string_view
, и хотя оба std::span
и std::string_view
являются несобственными представлениями, std::string_view
является представлением только для чтения.
Из документов:
Диапазон шаблона класса описывает объект, который может ссылаться на непрерывную последовательность объектов с первым элементом последовательности в нулевой позиции. Интервал может иметь либо обычный c экстент, в этом случае число элементов в последовательности известно и закодировано в типе, либо динамический c экстент.
Таким образом, следующее будет работать:
#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 << "\n";
}
return 0;
}
Проверьте это live
Поскольку std::span
в основном пара указатель - длина, вы также можете использовать ее следующим образом:
size_t size = 0;
int *data = get_data_from_library(size);
std::span<int> s{data, size};
Примечание: Не все компиляторы поддерживают std::span
. Проверьте поддержку компилятора здесь .
ОБНОВЛЕНИЕ
Если вы не можете использовать C ++ 20, вы можете использовать gsl::span
, которая в основном является базовой версией стандарта C ++ std::span
.
C ++ 11 решение
Если вы ограничены стандартом C ++ 11, вы можете попробовать реализовать ваш собственный простой span
класс:
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_;
}
};
Проверьте версию C ++ 11 live