- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 C++ 新手,所以请多多包涵。我想了解 STL iterator_traits
.在“C++ 标准库”一书中,结构 iterator_traits
定义如下:
template <class T>
struct iterator_traits {
typedef typename T::value_type value_type;
typedef typename T::difference_type difference_type;
typedef typename T::iterator_category iterator_category;
typedef typename T::pointer pointer;
typedef typename T::reference reference;
};
所以在我看来,它重新暴露了 T
的子类型。已经暴露了。再往前走,书中给出了如何使用它的示例,如下所示
template <class MyIterator>
void do_something(MyIterator start, MyIterator end) {
typedef typename iterator_traits<MyIterator>::value_type value_type;
value_type v = *start;
.....
}
我的问题是我为什么需要这个 iterator_traits
这里的结构,如果想法是获得 value_type
,我不能从 MyIterator
获得它吗?直接地 ?我的困惑似乎源于我(肯定是不正确的)理解子类型的信息必须来自 template <class T>
用于实例化 iterator_trait
.因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助。
最佳答案
指向数组的指针可以用作随机访问迭代器。
对于指针(显然不能将类型声明为嵌套类型,因为只有类可以具有嵌套类型)和类类型迭代器,需要某种一致的方法来获取这些类型。特征类模板提供了这种一致的方式。
iterator_traits
类模板专门用于如下指针:
template <typename T>
struct iterator_traits<T*>
{
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef std::ptrdiff_t difference_type;
};
关于c++ - iterator_trait 的典型用例是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6742008/
我正在尝试编制一份学校作业,但出现错误,而且由于这个时间 uni 没有合格的老师,我来这里寻求帮助。 我收到一条错误消息:“Error C2893 Failed to specialize funct
我想专攻std::iterator_traits<>对于 不 具有通常的嵌套 typedef(如 value_type、difference_type 等)的容器类模板的迭代器,我不应该修改其源代码。
我想加强基于范围的 for 循环,例如通过启用反向迭代。我设法通过编写适配器使其在某种程度上工作,但我不知道如何使适配器可组合。 #include template struct reversed
我是 C++ 新手,所以请多多包涵。我想了解 STL iterator_traits .在“C++ 标准库”一书中,结构 iterator_traits定义如下: template struct i
在更改了一些功能之后,我对自定义的 C++17 迭代器很陌生。为了说明错误,以下是说明问题的极简代码。报错了 auto[min_it, max_it] = std::minmax_element(r.
阅读 excerpt 时来自 cppreference If Iterator does not have the five member types difference_type, value_t
例如,引用 cplusplus.com 中的这个片段: template typename iterator_traits::difference_type count(InputIterator
我有一个模板函数,需要专用于迭代器。所以我所做的是: template void function2(T whatever, typename std::iterator_traits::point
有一个代码给出了一个错误,我完全不清楚。我想要的是通过 iterator_traits 传递一个指向结构/类成员的指针. template S mean(Iter begin, const Iter&
我想弄清楚对 forward_iterators 的 reference 有什么要求类型。在明显的情况下,您将拥有 value_type = T;和 reference = T&; .阅读 cppre
我正在这样做: const int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; const auto foo = cbegin(arr
为什么我不能编译下一段代码? #include struct test_iterator { using value_type = int; }; int main() { std:
我在故意为不特别遵守迭代器的函数抛出异常(出于测试目的)时遇到了麻烦。要了解我在做什么,请带上我的 decorator_iterator结构: struct decorated_iterator
这是我的 linked_list 模板的片段: #include #include template struct linked_list { struct iterator_base
给定: struct Iter { using value_type = int; using difference_type = int; using reference =
我有一些代码可以在 MSVC 下正常编译(或者说发送给我的 Windows 开发人员),但在 CLang 下会出错。环顾四周,我发现 CLang 在解析模板特化方面确实更加严格,但我不确定在我的案例中
我有以下函数和 vector : template RandomIterator upperBound(RandomIterator start, RandomIterator end, cons
C++ 新手。我想创建一个动态对象数组并使用 std::sort() 对它们进行排序。但是,出现了几个错误,我无法弄清楚原因。谢谢你的帮助。错误如下所示: > community\vc\tools\m
我最近了解到ForwardIterator需要operator *通过引用返回,这意味着迭代器返回代理,例如 std::vector , 不能是ForwardIterator([forward.ite
myVector 是 vector 节点。每个 Node 都有一个 int 值和一个字符串指针名称。我正在尝试创建一个简单的函数来确定此 vector 中的任何节点是否具有此名称。 vector::i
我是一名优秀的程序员,十分优秀!