C++ 在管道之前应用投影以查看或操作

C++ 在管道之前应用投影以查看或操作,c++,range-v3,C++,Range V3,我希望在将范围管道化到动作或视图之前应用投影。考虑下面的例子: #包括 #包括 #包括 #包括 int main() { 向量字符串{“1.2”、“100.2”、“11.2”、“0.2”、“2.2”}; ranges::for_each(strings,[](const auto&str){std::coutUpdate(2021.01.26): 对投影视图执行操作可能会导致混淆。例如,假设投影函数的签名为int&(std::pair&)/int&(std::pair&&),返回对的第一个组件,

我希望在将范围管道化到动作或视图之前应用投影。考虑下面的例子:

#包括
#包括
#包括
#包括
int main()
{
向量字符串{“1.2”、“100.2”、“11.2”、“0.2”、“2.2”};
ranges::for_each(strings,[](const auto&str){std::coutUpdate(2021.01.26):

对投影视图执行操作可能会导致混淆。例如,假设投影函数的签名为
int&(std::pair&)/int&(std::pair&&)
,返回对的第一个组件,将该投影应用于
std::pair
范围。如果我们
筛选
,会发生什么

  • 它应该返回
    int
    的范围,因为我们向它传递了
    int
    的范围
  • 它还应该返回一个范围
    std::pair
    ,因为我们确实想过滤
    std::pair
    的底层范围
但它不知道我们想要哪个

因此,这次似乎不适合将投影视为范围上的独立操作,相反,如果投影操作是筛选或排序的可选参数,则投影操作更清晰


旧答案(2021.01.15):

使用投影实现排序效率很低,可能这就是为什么不提供它的原因。您必须显式存储投影结果:
C++为什么不能在Rang-V3中排序一个范围?-堆栈溢出


标准版本说明投影的复杂性是不是回答了你的问题?我想我并不特别关心排序操作,所以它可能是一个很差的例子。它可以是一个视图:过滤器或其他操作。要点是,我希望所有下面的操作都考虑一个投影而不是p。为下面的每个操作提供相同的投影。@singhh23对投影视图执行操作可能会导致混淆。例如,想象一个带有签名的投影函数

int&(std::pair&)/int&(std::pair&)
返回对的第一个分量,将该投影应用于
std::pair
的范围。如果我们
筛选
,会发生什么?它应该返回
int
的范围,因为我们传递了
int
的范围,它还应该返回
std::pair
的范围,因为我们确实想筛选underlying range of
std::pair
,但它不知道我们想要哪个。@singhh23因此,这次似乎不适合将投影视为range上的独立操作,相反,如果投影操作是
filter
sort
的可选参数,则更加清楚。类似的一个:是的,您对返回类型对我来说很有意义-你能用它更新你的答案吗?我会接受的?