c++ - 一般来说,什么是迭代器?
问题描述
当我尝试使用接受“通用迭代器”的 ctor 编写 C++ 类模板时,就会出现这个问题。我不知道这里用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器。
换句话说,我对iterator感到困惑。似乎所有 STL 容器都有相同的类型迭代器,那么那个类型是什么?它只是指针吗?或者更复杂的东西?但 STL 容器确实接受普通指针。
(我想将它与Iterator<T>
in进行比较Java
,这很简单,它只是一个类)
解决方案
在 C++ 中,Iterator是一个概念,不是具体(或抽象)类型,而是任何遵循某些类似迭代器规则的类型。
例如,迭代器通常可以递增++i
。可以访问(取消引用)*i
它们以获取它们当前指向的值。它们本质上是指针的抽象。
在标准库的容器和算法中,有不同类型的具有不同属性的迭代器。它们的属性在这里列出:
https://en.cppreference.com/w/cpp/iterator
因此,在用 C++ 编写接受迭代器的算法时,通常只接受泛型模板参数并在函数中使用适当的迭代器属性。如果用户向您的函数传递了不遵守迭代器规则的内容,编译器会报错:
template<typename Iterator>
void my_algorithm(Iterator begin, Iterator end)
{
for(; begin != end; ++begin)
std::cout << *begin << '\n';
}
你可以添加一大堆特定的检查来确保用户通过了一些合理的东西,但这对于这个问题来说太宽泛了。
笔记:
虽然目前的概念,如Iterator,只是程序员必须遵循的标准中一组商定的语义属性,但将形式化这些概念(在代码中)的更全面的解决方案旨在用于标准的下一个版本,C+ +20。
推荐阅读
- xml - 删除命名空间并替换为另一个命名空间
- c# - C# DataTable to Json(自定义格式)
- npm - 有没有办法在每次安装或更新依赖项后运行脚本?
- java - Spring Boot 重定向网址
- java - Android Studio 不检查 query.addListenerForSingleValueEvent() 并且不返回任何内容
- c++ - Linux UDP 服务器 - 目标 IP 错误
- arrays - COBOL 解串成数组
- c# - c# 使用 this.Invoke 是否安全?
- wordpress - 仅为登录用户显示帖子 - Wordpress
- java - 如何打印说明用户输入索引太大的错误消息?