如何通过引用构建向量的子范围?
How do I construct a subrange of vector by reference?
我目前正在利用 std::vector
的范围构造函数来创建给定子范围的另一个向量。
std::vector<int> myVect { 1, 2, 3, 4 };
std::vector<int> subrangeVector(myVect.begin(), myVect.begin() + 2);
然而,这会导致 myVect 的范围值被复制并占用额外的内存。当使用有限的内存 and/or 处理非常大的元素类型时,这是不希望发生的事情。
如何通过引用构造另一个向量的子范围?
我的objective的简单解释如下:
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++ 向量是一种“拥有”其内存的类型 - 它不能是另一个向量数据的“引用类型”。
相反,您可能会发现 有用:跨度是 class 表示内存中的连续数据 - 就像向量一样;但是 - 它 是 一种“引用类型”,并且它 不是 拥有 - 正是你想要的。它的行为类似于向量 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
(例如来自 here)。
我目前正在利用 std::vector
的范围构造函数来创建给定子范围的另一个向量。
std::vector<int> myVect { 1, 2, 3, 4 };
std::vector<int> subrangeVector(myVect.begin(), myVect.begin() + 2);
然而,这会导致 myVect 的范围值被复制并占用额外的内存。当使用有限的内存 and/or 处理非常大的元素类型时,这是不希望发生的事情。
如何通过引用构造另一个向量的子范围?
我的objective的简单解释如下:
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++ 向量是一种“拥有”其内存的类型 - 它不能是另一个向量数据的“引用类型”。
相反,您可能会发现 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
(例如来自 here)。