使用Range library for C++14/17/20 extension时,我注意到当我存储Range::Views::Method()
操作的一些结果时,在运行时,原始数据的每次更改或更新都会导致新构造的结果发生相同的更改,即使在事件(指令)之后也是如此。
一个环节是存在的,但模式是什么,我们应该了解它什么?
在本例中,我使用了Ranges::Views::Reverse()
#include <iostream>
#include <vector>
#include <range/v3/all.hpp>
int main()
{
std::vector<int> values{1,2,3,4,5};
auto reversed = ranges::views::reverse(values);
values[3] = 0;
for(auto const& it : values){
std::cout<<it<<" ";
}
std::cout<<std::endl;
for(auto const& it : reversed){
std::cout<<it<<" ";
}
return 0;
}
输出:
1 2 3 0 5
5 0 3 2 1
values
的第4个值被更改,因此的第4个值也被反转
。
是的,因为这是ranges::views
的预期行为。 它应该是一些数据的非所有者视图。 如果底层数据发生了变化,则视图别无选择,只能查看这些变化,因为它没有自己的数据来保持以前的状态。
其中一个例外是ranges::views::single
,它保留自己的基础数据副本。 这是一个演示。