对一系列 std::vector 元素的常量引用

问题描述 投票:0回答:3

我想从

std::vector<MyClass>
获取一系列元素并将它们存储为常量引用,因为我只想读取但不想修改它们。

#include <iostream>
#include <vector>

// a "large" user class
class MyClass {
public:
    int data;
    MyClass(int val) : data(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++ iterator c++17 range stdvector
3个回答
2
投票

我想从 std::vector 获取一系列元素并将它们存储为 const 引用,因为我只想读取但不想修改它们。

最好是使用

std::span
,这需要 支持。

否则,您可以编写一个简单的

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);

观看现场演示


0
投票

std::跨度

const auto elRange = std::span(&myClass[1], &myClass[4]);

0
投票

这就是 std::span 的用途,但您需要 C++20。

如果你被困在较小的 C++ 版本上,你可以使用 boost::span。 (它需要 2 个标头才能包含在项目中,您不需要整个 boost 库)

auto elements = boost::span<const MyClass>{myClass}.subspan(start, end-start);

C++17 godbolt 示例

© www.soinside.com 2019 - 2024. All rights reserved.