如何通过参考构建向量的子句法



我当前正在利用std::vector的范围构造函数来创建给定子量的另一个向量。

std::vector<int> myVect { 1, 2, 3, 4 };
std::vector<int> subrangeVector(myVect.begin(), myVect.begin() + 2);

然而,这导致复制我的对流的值范围并占用额外的内存。这是与有限的内存和/或具有非常大元素类型的有限内存时不希望的。

如何通过参考构造另一个向量的子范围?

简化的我的目标解释如下:

void fun(std::vector<int> & v) { v.at(0) = 1; }
int main()
{
    std::vector<int> myVect { 1, 2, 3, 4 };
    std::size_t upperLimit = 5;
    std::vector<int> subrangeVector = subrangeView(myVect, upperLimit);
    fun(subrangeVector);  // so myVect.at(0) == 1
    return 0;
}

这将在许多不同的功能中实现,这些功能将std::vector用作参数。我不想通过此处讨论的迭代器。假设我无法控制函数fun

a c 向量是一种"拥有"的类型。它的内存 - 它不能是"参考类型"。进入另一个向量的数据。

相反,您可能会找到一个 span 有用:跨度是代表内存中连续数据的类 - 就像向量一样;但是 - a参考类型",它是不是拥有 - 您想要拥有的东西。它的行为就像向量W.R.T.迭代, operator[]等。

在您的情况下,您将写:

std::vector<int> myVect { 1, 2, 3, 4 };
auto subrange { std::span{myVect}.subspan(0, 2); }

,然后像打算在矢量一样使用子量。

ps:这是C 20代码,因为C 17还没有跨度;如果您使用的是较早的C 版本,请使用指南支持库中的gsl::span(例如,从此处(。

最新更新