提问者:小点点

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


使用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个值也被反转


共1个答案

匿名用户

是的,因为这是ranges::views的预期行为。 它应该是一些数据的非所有者视图。 如果底层数据发生了变化,则视图别无选择,只能查看这些变化,因为它没有自己的数据来保持以前的状态。

其中一个例外是ranges::views::single,它保留自己的基础数据副本。 这是一个演示。