我想从
std::vector<MyClass>
获取一系列元素并将它们存储为 const
-ref,因为我只想读取但不想修改它们。
#include <iostream>
#include <vector>
// A "large" user class
class MyClass
{ 民众: 整数数据; MyClass(int val) : 数据(val) {} };
int main()
{
// Initialize vector to MyClass objects
std::vector<MyClass> myClass{1, 2, 3, 4, 5, 6, 7, 8};
// Get const reference to element with index 0
const auto &el = myClass[0];
// Get const references to a range of elements
const unsigned int start = 1, end = 4;
// const auto &elRange = ???
return 0;
}
我怎样才能在
c++17
或更低的范围内实现这样的目标?
我想从 std::vector 获取一系列元素并将它们存储为 const 引用,因为我只想读取但不想修改它们。
std::span
,这需要 c++20 支持。
否则,您可以编写一个简单的
SimpleSpan
类来执行此操作。就这么简单:
// A simple span-like class for C++17
template<typename T>
class SimpleSpan
{
T* data_;
std::size_t size_;
public:
constexpr SimpleSpan(T* data, std::size_t size) : data_{ data }, size_{ size } {}
constexpr T& operator[](std::size_t index) { return data_[index]; }
constexpr T& operator[](std::size_t index) const { return data_[index]; }
constexpr T* begin() { return data_; }
constexpr T* end() { return data_ + size_; }
constexpr T* begin() const { return data_; }
constexpr T* end() const { return data_ + size_; }
constexpr std::size_t size() const { return size_; }
};
而且只是
// Get const references to a range of elements using our SimpleSpan
const unsigned int start = 1, end = 4;
SimpleSpan<const MyClass> elRange(&myClass[start], end - start);
这就是 std::span 的用途,但您需要 C++20。
如果您被困在较小的 C++ 版本上,您可以使用 boost::span。 (它需要 2 个标头才能包含在项目中,您不需要整个 boost 库)
auto elements = boost::span<const MyClass>{myClass}.subspan(start, end-start);
const auto elRange = std::span(&myClass[1], &myClass[4]);