在运行时使用范围更新结果
Updating results during runtime with Ranges
使用 Range library for C++14/17/20 extension 我注意到当我存储一些 range::views::method()
操作的结果时,在运行时,原始数据的每次更改或更新都会对其新构造的结果造成相同的更改,即使在事件(指令)之后。
有一个link,但是模式是什么,我们应该知道什么?
在这个例子中,我使用了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 个值已更改,因此 reversed
也已更改。
是的,因为那是 ranges::views
的预期行为。它应该是某些数据的非拥有 view。如果底层数据发生变化,那么视图别无选择,只能看到这些变化,因为它没有自己的数据来保持以前的状态。
一个例外是 ranges::views::single
,它保留自己的基础数据副本。这是 demo.
使用 Range library for C++14/17/20 extension 我注意到当我存储一些 range::views::method()
操作的结果时,在运行时,原始数据的每次更改或更新都会对其新构造的结果造成相同的更改,即使在事件(指令)之后。
有一个link,但是模式是什么,我们应该知道什么?
在这个例子中,我使用了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 个值已更改,因此 reversed
也已更改。
是的,因为那是 ranges::views
的预期行为。它应该是某些数据的非拥有 view。如果底层数据发生变化,那么视图别无选择,只能看到这些变化,因为它没有自己的数据来保持以前的状态。
一个例外是 ranges::views::single
,它保留自己的基础数据副本。这是 demo.