【发布时间】:2021-01-20 13:09:51
【问题描述】:
看不懂下面代码的结果(用g++-10编译的C++20):
#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>
int main() {
using namespace std;
auto v = vector<int>{0,1,2,3,4,5,6,7};
auto r = v | views::filter([](int n) {return n % 3 == 0;});
ranges::generate(r,[]() { return 2; });
auto s = v | views::filter([](int n) {return n % 3 == 0;});
cout << "v: ";
for(auto x: v) cout << x << " ";
cout << "\n";
cout << "r: ";
for (auto x: r) cout << x << " " ;
cout << "\n";
cout << "s: ";
for (auto x: s) cout << x << " " ;
cout << "\n";
}
在我的机器上,结果是:
v: 2 1 2 2 4 5 2 7
r: 2
s:
我理解第一行 (v) 和第三行 (s):在 v 中,可被 3 整除的整数被替换为 2(第一行),因此之后不再有整数可以被 3 整除。因此第三行是空的。
但是为什么第二行(r)显示唯一值2,和第三行不一样???
如果我在 range::generate 中将 2 替换为 3,那么结果是正常的:
v: 3 1 2 3 4 5 3 7
r: 3 3 3
s: 3 3 3
也许原因是微不足道的,但我在文档中没有找到任何原因...
【问题讨论】: