Acerca de iter1-iter2
La tabla 3.7 en C ++ Primer (versión en inglés, página 111) tiene:
Al restar dos iteradores se obtiene el número que, cuando se agrega al iterador de la derecha, se obtiene el iterador de la izquierda. Los iteradores deben denotar elementos en, o uno más allá del final del mismo contenedor.
Puede resultar difícil entender esta oración. Pero primero, la salida es un número. Y este número es la diferencia de ubicación (distancia de ubicación (firmada)) (tan fácil de recordar) (por supuesto que está firmado), en lugar de generar el valor almacenado en el vector en esa ubicación como iter-n. Al hacer el ejercicio 3.24 (b), el concepto se confundió. Lo siguiente es una prueba a través de una prueba, como se muestra en la siguiente figura:
Acerca de - ivec.end ()
El libro dice en la nota de la página 107 que no se puede incrementar ni desreferenciar. Nota: No lo dé por sentado, está bien no aumentarlo sino restarlo .
Se puede ejecutar el siguiente programa (ejercicio 3.24 (b)).
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int i;
while (cin >> i)
ivec.push_back(i);
for (auto it = ivec.begin(), IT=--ivec.end(); it != ivec.begin() + ivec.size() / 2; ++it, --IT)
cout << *it + *IT << " ";
if (ivec.size() % 2 == 0) cout << endl;
else cout << *(ivec.begin() + ivec.size() / 2 )<< endl;
return 0;
}
De manera similar, en la nota P119, dice " No podemos eliminar la referencia o incrementar un puntero fuera del extremo ". Es decir, cuando el puntero apunta al final (/ * * /), no se puede acceder a él indirectamente o ++.
El siguiente es el procedimiento de prueba:
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[] = {
0,1,2,3,4 };
int* p = end(a);
cout << *p << endl;
--p;
cout << *p << endl;
return 0;
}
Resultado:
-858993460
4