"C++ 入门经典 中文版"
这篇内容摘自《C++ Primer Plus》第三版的中文版,由Stanley B. Lippman和Josée Lajoie撰写,潘爱民和张丽翻译。书中介绍了C++编程语言的基础知识,特别关注泛型算法和迭代器的使用。
在C++中,泛型算法是一种独立于具体容器类型的操作,它们可以应用于各种类型的容器,如`map`、`set`、`list`、`vector`和`deque`。这些算法通常需要两个迭代器参数,`first`和`last`,它们定义了要操作的元素范围。这个范围是左闭合的,即包含`first`但不包含`last`。如果`first`等于`last`,则表示范围为空。迭代器必须能够通过递增操作从`first`达到`last`,否则会导致未定义的行为,可能造成程序崩溃。
`map`、`set`和`list`容器的迭代器是双向迭代器,这意味着它们可以向前和向后移动,但不支持随机访问。因此,它们不能用于需要`RandomAccessIterator`的泛型算法,如`sort_heap()`和`nth_element()`。相反,`vector`和`deque`的迭代器支持随机访问,因此可以使用所有泛型算法。
练习12.6中指出了一些常见错误:
(a) 在常量`vector`上调用非常量迭代器操作。
(b) 在未初始化的`vector`上调用`fill()`。
(c) 使用`rend()`(反向迭代器的末尾)而非`end()`排序,这会导致错误。
(d) `list`不支持直接使用`binary_search()`,因为它需要随机访问迭代器。
(e) 两个不同`vector`的迭代器不能直接用于`sort()`,它们应属于同一个容器。
练习12.7要求编写一个程序,使用`istream_iterator`从标准输入读取整数,然后使用`ostream_iterator`将奇数写入一个文件,偶数写入另一个文件,每个数值之间用空格分隔,并且每行写一个数值。这展示了C++迭代器在输入/输出操作中的应用。
12.5节进一步探讨了泛型算法的异常处理和对迭代器类别要求的细节。C++的迭代器分为五类:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,每种类型支持不同的操作。例如,`find()`函数只需要输入迭代器,但更高级的算法可能需要更强的迭代器类型,如`sort()`需要随机访问迭代器。
这段内容强调了理解迭代器类别和它们在泛型算法中的作用的重要性,这对于有效和安全地使用C++标准库是至关重要的。