在运行时使用范围更新结果

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.