我正在学习C ++ 20范围(使用Range-V3-VS2015)。我的代码工作正常:
string clean;
auto tmp1 = input | view::remove_if(not_alpha) | view::transform(::tolower);
std::copy(tmp1.begin(), tmp1.end(), std::back_inserter(clean));
auto tmp2 = clean |= action::sort | action::unique;
但是,我想将定义tmp1
和tmp2
的两个管道合并到一个管道中。那可能吗?我尝试了很多事情,包括在中间添加view::move
和view::copy
都无济于事。
答案 0 :(得分:11)
可以。您需要使用转换将视图具体化为实际的容器才能对其执行操作。我在range-v3主分支中找到了一段新代码,其中引入了range::v3::to<Container>
来执行这种转换。
git blame
建议Eric从今年(2019年)开始研究它,但尚未真正记录在案。但是,我发现range-v3/test
关于该库的使用非常不错的学习材料:)
我怀疑它在VS2015分支中是否可用。但是,Visual 2017已经可以使用该库的master分支。
#include <string>
#include <iostream>
#include <cctype>
#include <range/v3/view/filter.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/action/sort.hpp>
#include <range/v3/action/unique.hpp>
#include <range/v3/range/conversion.hpp>
int main() {
using namespace ranges::v3;
std::string input = " 1a2a3Z4b5Z6cz ";
std::string result = input
| view::filter(::isalpha)
| view::transform(::tolower)
| to<std::string>
| action::sort
| action::unique;
std::cout << result << std::endl;
return 0;
}
输出:
abcz
我相信这是您的期望
答案 1 :(得分:4)
ranges::to
是您想要的。
滚动自己的半替换位置很容易。
template<class C, class R>
C to_container( R&& r ) {
using std::begin; using std::end;
return C( begin(std::forward<R>(r)), end(std::forward<R>(r)) );
}
不是库强度(缺少早期失败是最大的问题,并且不支持|
),但是相当有用。
然后我们只是:
std::string r = to_container<std::string>( input | view::remove_if(not_alpha) | view::transform(::tolower) ) | action::sort | action::unique;
请注意,std
中函数的地址为no longer advised(通过上面评论中的@DavisHerring)
要升级到|
:
template<class C>
struct to_container_t {
template<class R>
C operator()( R&& r )const {
using std::begin; using std::end;
return C( begin(std::forward<R>(r)), end(std::forward<R>(r)) );
}
template<class R>
friend C operator|( R&& r, to_container_t self ){
return self( std::forward<R>(r) );
}
};
template<class C>
constexpr to_container_t<C> to_container{};
哪个给了我们
std::string r = input | view::remove_if(not_alpha) | view::transform(::tolower) | to_container<std::string> | action::sort | action::unique;
根据需要。