- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
例如,引用 cplusplus.com 中的这个片段:
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& val)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (*first == val)
++ret;
++first;
}
return ret;
}
问题是为什么在这种情况下使用 iterator_traits
而不是采用另一个模板参数,如下所示:
template <class InputIterator, class T, class DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
DiffType ret = 0;
while (first!=last) {
if (*first == val)
++ret;
++first;
}
return ret;
}
最佳答案
您在评论中提出的建议 - 让函数接受另一个模板参数 - 不会像您预期的那样工作。这是您建议的代码:
template <class InputIterator, class T, typename DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
DiffType ret = 0;
while (first!=last) {
if (*first == val)
++ret;
++first;
}
return ret;
}
这段代码的问题在于它不再编译:
std::vector<int> v = /* ... */;
auto numElems = count(v.begin(), v.end(), 137); // <--- Error!
这里的问题是,为了调用函数模板,每个模板参数要么必须从参数类型中推导出来,要么由调用者明确指定。这里,类型 DiffType
不能从参数类型中推断出来(InputIterator
和 T
类型可以从两个参数中推断出来,但是仅从签名来看没有上下文),因此此调用将因编译器错误而失败。此处使用 std::iterator_traits
是一种通用模板模式,用于从迭代器类型本身提取有关迭代器的信息。
关于c++ - 为什么在模板函数中使用 iterator_traits 而不是仅仅使用另一个模板类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724465/
我正在尝试编制一份学校作业,但出现错误,而且由于这个时间 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
我是一名优秀的程序员,十分优秀!