Index: gcc/libstdc++-v3/doc/xml/manual/iterators.xml |
diff --git a/gcc/libstdc++-v3/doc/xml/manual/iterators.xml b/gcc/libstdc++-v3/doc/xml/manual/iterators.xml |
deleted file mode 100644 |
index f5e4e065a1f05fca8049c88a1f7bd92f7bda0c5e..0000000000000000000000000000000000000000 |
--- a/gcc/libstdc++-v3/doc/xml/manual/iterators.xml |
+++ /dev/null |
@@ -1,180 +0,0 @@ |
-<?xml version='1.0'?> |
-<!DOCTYPE part PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" |
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" |
-[ ]> |
- |
-<part id="manual.iterators" xreflabel="Iterators"> |
-<?dbhtml filename="iterators.html"?> |
- |
-<partinfo> |
- <keywordset> |
- <keyword> |
- ISO C++ |
- </keyword> |
- <keyword> |
- library |
- </keyword> |
- </keywordset> |
-</partinfo> |
- |
-<title> |
- Iterators |
- <indexterm><primary>Iterators</primary></indexterm> |
-</title> |
- |
-<!-- Chapter 01 : Predefined --> |
-<chapter id="manual.iterators.predefined" xreflabel="Predefined"> |
- <title>Predefined</title> |
- |
- <sect1 id="iterators.predefined.vs_pointers" xreflabel="Versus Pointers"> |
- <title>Iterators vs. Pointers</title> |
- <para><ulink url="../faq/index.html#5_1">FAQ 5.1</ulink> points out that iterators |
- are not implemented as pointers. They are a generalization of |
- pointers, but they are implemented in libstdc++ as separate classes. |
- </para> |
- <para>Keeping that simple fact in mind as you design your code will |
- prevent a whole lot of difficult-to-understand bugs. |
- </para> |
- <para>You can think of it the other way 'round, even. Since iterators |
- are a generalization, that means that <emphasis>pointers</emphasis> are |
- <emphasis>iterators</emphasis>, and that pointers can be used whenever an |
- iterator would be. All those functions in the Algorithms chapter |
- of the Standard will work just as well on plain arrays and their |
- pointers. |
- </para> |
- <para>That doesn't mean that when you pass in a pointer, it gets wrapped |
- into some special delegating iterator-to-pointer class with a layer |
- of overhead. (If you think that's the case anywhere, you don't |
- understand templates to begin with...) Oh, no; if you pass |
- in a pointer, then the compiler will instantiate that template |
- using T* as a type, and good old high-speed pointer arithmetic as |
- its operations, so the resulting code will be doing exactly the same |
- things as it would be doing if you had hand-coded it yourself (for |
- the 273rd time). |
- </para> |
- <para>How much overhead <emphasis>is</emphasis> there when using an iterator class? |
- Very little. Most of the layering classes contain nothing but |
- typedefs, and typedefs are "meta-information" that simply |
- tell the compiler some nicknames; they don't create code. That |
- information gets passed down through inheritance, so while the |
- compiler has to do work looking up all the names, your runtime code |
- does not. (This has been a prime concern from the beginning.) |
- </para> |
- |
- |
- </sect1> |
- |
- <sect1 id="iterators.predefined.end" xreflabel="end() Is One Past the End"> |
- <title>One Past the End</title> |
- |
- <para>This starts off sounding complicated, but is actually very easy, |
- especially towards the end. Trust me. |
- </para> |
- <para>Beginners usually have a little trouble understand the whole |
- 'past-the-end' thing, until they remember their early algebra classes |
- (see, they <emphasis>told</emphasis> you that stuff would come in handy!) and |
- the concept of half-open ranges. |
- </para> |
- <para>First, some history, and a reminder of some of the funkier rules in |
- C and C++ for builtin arrays. The following rules have always been |
- true for both languages: |
- </para> |
- <orderedlist> |
- <listitem> |
- <para>You can point anywhere in the array, <emphasis>or to the first element |
- past the end of the array</emphasis>. A pointer that points to one |
- past the end of the array is guaranteed to be as unique as a |
- pointer to somewhere inside the array, so that you can compare |
- such pointers safely. |
- </para> |
- </listitem> |
- <listitem> |
- <para>You can only dereference a pointer that points into an array. |
- If your array pointer points outside the array -- even to just |
- one past the end -- and you dereference it, Bad Things happen. |
- </para> |
- </listitem> |
- <listitem> |
- <para>Strictly speaking, simply pointing anywhere else invokes |
- undefined behavior. Most programs won't puke until such a |
- pointer is actually dereferenced, but the standards leave that |
- up to the platform. |
- </para> |
- </listitem> |
- </orderedlist> |
- <para>The reason this past-the-end addressing was allowed is to make it |
- easy to write a loop to go over an entire array, e.g., |
- while (*d++ = *s++);. |
- </para> |
- <para>So, when you think of two pointers delimiting an array, don't think |
- of them as indexing 0 through n-1. Think of them as <emphasis>boundary |
- markers</emphasis>: |
- </para> |
- <programlisting> |
- |
- beginning end |
- | | |
- | | This is bad. Always having to |
- | | remember to add or subtract one. |
- | | Off-by-one bugs very common here. |
- V V |
- array of N elements |
- |---|---|--...--|---|---| |
- | 0 | 1 | ... |N-2|N-1| |
- |---|---|--...--|---|---| |
- |
- ^ ^ |
- | | |
- | | This is good. This is safe. This |
- | | is guaranteed to work. Just don't |
- | | dereference 'end'. |
- beginning end |
- |
- </programlisting> |
- <para>See? Everything between the boundary markers is part of the array. |
- Simple. |
- </para> |
- <para>Now think back to your junior-high school algebra course, when you |
- were learning how to draw graphs. Remember that a graph terminating |
- with a solid dot meant, "Everything up through this point," |
- and a graph terminating with an open dot meant, "Everything up |
- to, but not including, this point," respectively called closed |
- and open ranges? Remember how closed ranges were written with |
- brackets, <emphasis>[a,b]</emphasis>, and open ranges were written with parentheses, |
- <emphasis>(a,b)</emphasis>? |
- </para> |
- <para>The boundary markers for arrays describe a <emphasis>half-open range</emphasis>, |
- starting with (and including) the first element, and ending with (but |
- not including) the last element: <emphasis>[beginning,end)</emphasis>. See, I |
- told you it would be simple in the end. |
- </para> |
- <para>Iterators, and everything working with iterators, follows this same |
- time-honored tradition. A container's <code>begin()</code> method returns |
- an iterator referring to the first element, and its <code>end()</code> |
- method returns a past-the-end iterator, which is guaranteed to be |
- unique and comparable against any other iterator pointing into the |
- middle of the container. |
- </para> |
- <para>Container constructors, container methods, and algorithms, all take |
- pairs of iterators describing a range of values on which to operate. |
- All of these ranges are half-open ranges, so you pass the beginning |
- iterator as the starting parameter, and the one-past-the-end iterator |
- as the finishing parameter. |
- </para> |
- <para>This generalizes very well. You can operate on sub-ranges quite |
- easily this way; functions accepting a <emphasis>[first,last)</emphasis> range |
- don't know or care whether they are the boundaries of an entire {array, |
- sequence, container, whatever}, or whether they only enclose a few |
- elements from the center. This approach also makes zero-length |
- sequences very simple to recognize: if the two endpoints compare |
- equal, then the {array, sequence, container, whatever} is empty. |
- </para> |
- <para>Just don't dereference <code>end()</code>. |
- </para> |
- |
- </sect1> |
-</chapter> |
- |
-<!-- Chapter 02 : Stream --> |
- |
-</part> |