【发布时间】:2021-08-15 09:33:06
【问题描述】:
我正在使用范围库来帮助我的课程中的文件管理器数据,如下所示:
class MyClass
{
public:
MyClass(std::vector<int> v) : vec(v) {}
std::vector<int> getEvens() const
{
auto evens = vec | ranges::views::filter([](int i) { return ! (i % 2); });
return std::vector<int>(evens.begin(), evens.end());
}
private:
std::vector<int> vec;
};
在这种情况下,getEvents() 函数中构造了一个新向量。为了节省这个开销,我想知道是否可以/建议直接从函数返回范围?
class MyClass
{
public:
using RangeReturnType = ???;
MyClass(std::vector<int> v) : vec(v) {}
RangeReturnType getEvens() const
{
auto evens = vec | ranges::views::filter([](int i) { return ! (i % 2); });
// ...
return evens;
}
private:
std::vector<int> vec;
};
如果可能,是否有任何我需要考虑的生命周期因素?
我也很想知道是否可以/建议将范围作为参数传递,或者将其存储为成员变量。还是范围库更适合在单个函数的范围内使用?
【问题讨论】:
-
为什么不返回
auto? -
也许你想要的只是一个
getView函数,它返回vec作为视图,even是一个免费的lambda,可以被views::filter调用 -
您希望将其作为
vector返回的唯一原因是,如果您知道每次调用它时都希望将其存储为新的vector。否则,您可以随时返回一个视图并在需要时为其创建一个向量。 -
我如何创建一个视图来返回它?
-
我想出了一个... auto range = container |范围::views::all;