创建std :: std上的范围 我正在通过“ C ++的功能编程”(是的,它的牙齿越长,但这是我现在拥有的),我正在尝试将其中的一些示例转换为C ++ 20(g ++ ...

问题描述 投票:0回答:1
并将其转换为单个单词,降低字母,从该集合中删除任何非alphanumerics有关,然后对其进行整理。 原始写入使用了范围/v3库,我在正确转换为C ++ 20时遇到了困难。 特别是在stdin上创建范围(或视图)的初始部分,然后将其传递给下一个转换。 我正在尝试使用以下内容:

const std::vector<std::string> words = // Getting a range of words (tokens) from cin std::views::istream<std::string>(std::cin) | views::transform(tolower) // Converting all words to lower-case | views::transform(isalnum) // Removing non alphanumeric characters from the words | views::filter([] (const std::string &s) { return !s.empty(); }) | std::ranges::sort;

this this the第一个失败,错误:

transform

在典型的C ++时尚中,这是非常精确且完全无法理解的(对我来说)。  我已经尝试创建各种方法的初始范围,但是显然它们都解决了相同的基础
main.cpp: In function ‘int main(int, char**)’: main.cpp:38:9: error: no match for ‘operator|’ (operand types are ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ and ‘std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int) noexcept>’) 37 | std::views::istream<std::string>(std::cin) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> > 38 | | views::transform(tolower) // Converting all words to lower-case | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int) noexcept> In file included from main.cpp:7: /usr/include/c++/13/ranges:896:7: note: candidate: ‘template<class _Lhs, class _Rhs> requires (derived_from<_Lhs, std::ranges::views::__adaptor::_RangeAdaptorClosure>) && (derived_from<_Rhs, std::ranges::views::__adaptor::_RangeAdaptorClosure>) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs)’ 896 | operator|(_Lhs __lhs, _Rhs __rhs) | ^~~~~~~~ /usr/include/c++/13/ranges:896:7: note: template argument deduction/substitution failed: /usr/include/c++/13/ranges:896:7: note: constraints not satisfied In file included from /usr/include/c++/13/compare:37, from /usr/include/c++/13/bits/char_traits.h:56, from /usr/include/c++/13/ios:42, from /usr/include/c++/13/ostream:40, from /usr/include/c++/13/iostream:41, from main.cpp:1: /usr/include/c++/13/concepts: In substitution of ‘template<class _Lhs, class _Rhs> requires (derived_from<_Lhs, std::ranges::views::__adaptor::_RangeAdaptorClosure>) && (derived_from<_Rhs, std::ranges::views::__adaptor::_RangeAdaptorClosure>) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs) [with _Lhs = std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >; _Rhs = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int) noexcept>]’: main.cpp:38:35: required from here /usr/include/c++/13/concepts:67:13: required for the satisfaction of ‘derived_from<_Lhs, std::ranges::views::__adaptor::_RangeAdaptorClosure>’ [with _Lhs = std::ranges::basic_istream_view<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >] /usr/include/c++/13/concepts:67:28: note: ‘std::ranges::views::__adaptor::_RangeAdaptorClosure’ is not a base of ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ 67 | concept derived_from = __is_base_of(_Base, _Derived) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/13/ranges:887:7: note: candidate: ‘template<class _Self, class _Range> requires (derived_from<typename std::remove_cvref<_Tp>::type, std::ranges::views::__adaptor::_RangeAdaptorClosure>) && (__adaptor_invocable<_Self, _Range>) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&)’ 887 | operator|(_Range&& __r, _Self&& __self) | ^~~~~~~~ /usr/include/c++/13/ranges:887:7: note: template argument deduction/substitution failed: /usr/include/c++/13/ranges:887:7: note: constraints not satisfied /usr/include/c++/13/ranges: In substitution of ‘template<class _Self, class _Range> requires (derived_from<typename std::remove_cvref<_Tp>::type, std::ranges::views::__adaptor::_RangeAdaptorClosure>) && (__adaptor_invocable<_Self, _Range>) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&) [with _Self = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int) noexcept>; _Range = std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >]’: main.cpp:38:35: required from here /usr/include/c++/13/ranges:859:13: required for the satisfaction of ‘__adaptor_invocable<_Self, _Range>’ [with _Self = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int)noexcept (true)>; _Range = std::ranges::basic_istream_view<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >] /usr/include/c++/13/ranges:860:9: in requirements [with _Adaptor = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, int (*)(int)noexcept (true)>; _Args = {std::ranges::basic_istream_view<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >}] /usr/include/c++/13/ranges:860:44: note: the required expression ‘declval<_Adaptor>()((declval<_Args>)()...)’ is invalid 860 | = requires { std::declval<_Adaptor>()(declval<_Args>()...); }; | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~ cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail In file included from /usr/include/c++/13/bits/memory_resource.h:38, from /usr/include/c++/13/string:58, from /usr/include/c++/13/bits/locale_classes.h:40, from /usr/include/c++/13/bits/ios_base.h:41, from /usr/include/c++/13/ios:44: /usr/include/c++/13/cstddef:135:3: note: candidate: ‘constexpr std::byte std::operator|(byte, byte)’ 135 | operator|(byte __l, byte __r) noexcept | ^~~~~~~~ /usr/include/c++/13/cstddef:135:18: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ to ‘std::byte’ 135 | operator|(byte __l, byte __r) noexcept | ~~~~~^~~ /usr/include/c++/13/bits/ios_base.h:87:3: note: candidate: ‘constexpr std::_Ios_Fmtflags std::operator|(_Ios_Fmtflags, _Ios_Fmtflags)’ 87 | operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | ^~~~~~~~ /usr/include/c++/13/bits/ios_base.h:87:27: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ to ‘std::_Ios_Fmtflags’ 87 | operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | ~~~~~~~~~~~~~~^~~ /usr/include/c++/13/bits/ios_base.h:130:3: note: candidate: ‘constexpr std::_Ios_Openmode std::operator|(_Ios_Openmode, _Ios_Openmode)’ 130 | operator|(_Ios_Openmode __a, _Ios_Openmode __b) | ^~~~~~~~ /usr/include/c++/13/bits/ios_base.h:130:27: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ to ‘std::_Ios_Openmode’ 130 | operator|(_Ios_Openmode __a, _Ios_Openmode __b) | ~~~~~~~~~~~~~~^~~ /usr/include/c++/13/bits/ios_base.h:170:3: note: candidate: ‘constexpr std::_Ios_Iostate std::operator|(_Ios_Iostate, _Ios_Iostate)’ 170 | operator|(_Ios_Iostate __a, _Ios_Iostate __b) | ^~~~~~~~ /usr/include/c++/13/bits/ios_base.h:170:26: note: no known conversion for argument 1 from ‘std::ranges::basic_istream_view<std::__cxx11::basic_string<char>, char, std::char_traits<char> >’ to ‘std::_Ios_Iostate’ 170 | operator|(_Ios_Iostate __a, _Ios_Iostate __b) | ~~~~~~~~~~~~~^~~

,因此结果是相同的。

明显在原始范围/V3库(带有
std::ranges::basic_istream_view

)中使用,但在当前的STD库中不起作用。
有一种方法可以使它工作吗?

我在您的代码中看到的问题:

您有
istream_range<std::string>(std::cin)

,但是这种观点不存在。

std::views::istream
c++ c++20 std-ranges
1个回答
0
投票
boolean

值,而不是

弦。
    管道(
  1. isalnum
    )操作员无法按照您使用的方式工作。
    
  2. 使用
  3. |
    std::ranges::sort读书: std::ranges::istream_view
  4. 然后对小写和字母数字过滤进行转换:
    std::cin
    将结果转化为a,然后排序:
auto words = std::ranges::istream_view<std::string>(std::cin);

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.