c++ - 如何通过引用构造 vector 的子范围?

标签 c++ slice stdvector reference-type

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

std::vector<int> myVect { 1, 2, 3, 4 };

std::vector<int> subrangeVector(myVect.begin(), myVect.begin() + 2);

但是,这会导致 myVect 的范围值被复制并占用额外的内存。当使用有限的内存和/或非常大的元素类型时,这是不希望出现的情况。

如何通过引用构造另一个 vector 的子范围?

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

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 作为参数的不同函数中实现。我不想按照讨论的方式传递迭代器 here 。假设我无法控制函数 fun

最佳答案

C++ vector 是一种“拥有”其内存的类型 - 它不能成为另一个 vector 数据的“引用类型”。

相反,您可能会找到 span有用:跨度是代表内存中连续数据的类 - 就像 vector 一样;但是 - 它一个“引用类型”,并且它拥有 - 正是您想要拥有的。它的行为就像一个 vector w.r.t.迭代、operator[] 等等。

在你的情况下,你会写:

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

然后使用子范围,就像您计划使用 vector 一样。

PS:这是 C++20 代码,因为 C++17 还没有跨度;如果您使用的是早期 C++ 版本,请使用指南支持库中的 gsl::span(例如来自 here )。

关于c++ - 如何通过引用构造 vector 的子范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56190395/

相关文章:

c++ - 无限窗口消息循环 - C++

vector 映射的 C++ 映射作为实例成员

java - Android Studio - 在现有的旧项目中启用 native C++ 调试 (card.io Android Source)

c++ - 通过 Tcp 套接字发送文件大小

arrays - 将哈希切片传递给需要数组引用的子例程

python - Pandas 如何切片多索引数据帧?

go - 如何在 slice 的开头插入元素?

c++ - 哪种获取成员方法更好?

c++ - std::vector<unsigned char> 在使用 std::ifstream 读取二进制文件后保持为空

c++ - Memcached 如何确保它在内存中的页面不会被其他页面换出?