范围 V3:获取基本迭代器
Range-V3: get base iterator
我尝试使用Range-V3库(用于MSVC(,但由于缺乏文档,我不明白如何做一件事。
std::map<int, std::wstring> ss = { {1,L"1"}, {2,L"2"}, {3,L"3"} };
auto rng = ss | ranges::view::reverse | ranges::view::values;
auto it = ranges::find_if(rng, [](auto&&x) {return x == L"2"; });
if (it != rng.end()) {
assert(it.base()->first == 2); // this does not compile
}
我能从find_if
得到什么?这是迭代器吗?我想让一个迭代器到基本元素,即ss
映射中的值。
这是我得到的错误:
1>d:sourcesranges_testranges_test.cpp(11): error C2819: type 'ranges::v3::basic_iterator<ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>,ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>>' does not have an overloaded member 'operator ->'
1> with
1> [
1> _Kty=int,
1> _Ty=std::wstring
1> ]
1>d:sourcesfingraddev.fingradsrcvclibrangev3utilitybasic_iterator.hpp(656): note: see declaration of 'ranges::v3::basic_iterator<ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>,ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>>'
1> with
1> [
1> _Kty=int,
1> _Ty=std::wstring
1> ]
1>d:sourcesranges_testranges_test.cpp(11): note: did you intend to use '.' instead?
1>d:sourcesranges_testranges_test.cpp(11): error C2039: 'first': is not a member of 'ranges::v3::basic_iterator<ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>,ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>>'
1> with
1> [
1> _Kty=int,
1> _Ty=std::wstring
1> ]
1>d:sourcesfingraddev.fingradsrcvclibrangev3utilitybasic_iterator.hpp(656): note: see declaration of 'ranges::v3::basic_iterator<ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>,ranges::v3::adaptor_cursor<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,ranges::v3::reverse_view<ranges::v3::sized_range<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>>>::adaptor<true>>>'
1> with
1> [
1> _Kty=int,
1> _Ty=std::wstring
1> ]
这
看起来像是 range-V3 的 MSVC 实现中的错误1(或者更确切地说是缺少的功能(。一个简单的解决方法是将您的代码替换为:
assert((*it.base()).first == 2);
这应该有效operator*
因为basic_iterator
是过载operator->
而不是。
1 如果你查看 MSVC 源代码的basic_iterator
,你会发现operator->
没有过载,而在原始范围 v3 basic_iterator
中有一个。
相关文章:
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 如何在C++中仅获取容器内类成员的迭代器
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 从 QMap<K、T> 获取 Java 样式迭代器,而不指定 T、K
- 获取 c++ 中具有恒定长度的数组的迭代器
- 使用列表迭代器获取所有值
- 如何从迭代器获取列表
- 使用迭代器获取字符串中的短语
- 从数组列表中的字符串迭代器获取 int dat<struct>
- 通过迭代器获取 set 元素的"index"
- 从迭代器获取索引处的元素
- 从boost::property_tree::ptree::迭代器获取ptree
- 从输入迭代器获取最后一项
- Boost:: Dijkstra 最短路径,如何从路径迭代器获取顶点索引
- 使用迭代器获取映射中与条件匹配的每个项
- 使用临时程序将迭代器获取到STL容器时的细微错误:如何避免
- unique_ptr unordered_map:无法从迭代器获取价值
- 防止自定义迭代器获取nullptr
- 无法使用自定义迭代器获取std::find_if进行编译