Cuando los elementos de inserto vector iterador de invalidación
1. Número () menos que en los elementos End Añadir
#include <iostream>
#include <vector>
using namespace std;
//输出
void show(vector<int> &v);
//迭代器
vector<int>::iterator i1, i2, i3;
int main()
{
vector<int> vi{1, 2};
i1 = vi.begin();
i2 = ++vi.begin();
i3 = vi.end();
//输出
show(vi);
//在末尾插入
vi.push_back(3);
//输出
show(vi);
return 0;
}
void show(vector<int> &v)
{
cout << "size: " << v.size() << endl;
cout << "capaticy: " << v.capacity() << endl;
cout << "vector: ";
for (auto &a : v)
{
cout << a << "(" << &a << ")"
<< "\t";
}
cout << endl
<< "iterate: ";
cout << *i1 << "(" << &(*i1) << ")"
<< "\t";
cout << *i2 << "(" << &(*i2) << ")"
<< "\t";
cout << *i3 << "(" << &(*i3) << ")" //解引用尾后迭代器未定义
<< "\t";
cout << endl
<< endl;
}
análisis:
- Debido a que el tamaño () == capacidad (), de modo que los elementos de inserción, la memoria se reasigna vector. vi originalmente de 0x3a0f88 inicio, elementos de inserción, vi 0x3a0f98 desde el principio.
- Antes de introducir elementos, i1 punto vi primer elemento, i2 vi punto en el segundo elemento, punto i3 al extremo del elemento no existe, * i3 es indefinido.
- Después de elementos de inserción, la memoria se reasigna vector, i1, i2 y i3 área de memoria punto desconocido, por lo i1, i2 y i3 ha expirado.
2. capacidad () suficiente para añadir elementos al final
#include <iostream>
#include <vector>
using namespace std;
//输出
void show(vector<int> &v);
//迭代器
vector<int>::iterator i1, i2, i3;
int main()
{
vector<int> vi{1, 2};
//扩充存储空间
vi.reserve(4);
//迭代器
i1 = vi.begin();
i2 = ++vi.begin();
i3 = vi.end();
//输出
show(vi);
//在末尾插入
vi.push_back(3);
//输出
show(vi);
return 0;
}
void show(vector<int> &v)
{
cout << "size: " << v.size() << endl;
cout << "capaticy: " << v.capacity() << endl;
cout << "vector: ";
for (auto &a : v)
{
cout << a << "(" << &a << ")"
<< "\t";
}
cout << endl
<< "iterate: ";
cout << *i1 << "(" << &(*i1) << ")"
<< "\t";
cout << *i2 << "(" << &(*i2) << ")"
<< "\t";
cout << *i3 << "(" << &(*i3) << ")" //解引用尾后迭代器未定义
<< "\t";
cout << endl
<< endl;
}
análisis:
- Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
- Antes y después de elementos de inserción, i1 siempre apunta a la primera vi elemento, I2 vi siempre apuntan en los dos primeros elementos, y su valor no ha cambiado. Por lo tanto, i1 e i2 son todavía válidas.
- Antes de introducir elementos, punto i3 después de que el último elemento vi ausencia, * i3 es indefinido; los elementos de inserto, * i3 = 3, después del último elemento puntos más largos no, i3 fracaso.
3. Capacidad () elemento aditivo suficiente en el intermedio
#include <iostream>
#include <vector>
using namespace std;
//输出
void show(vector<int> &v);
//迭代器
vector<int>::iterator i1, i2, i3;
int main()
{
vector<int> vi{1, 2};
//扩充存储空间
vi.reserve(4);
//迭代器
i1 = vi.begin();
i2 = ++vi.begin();
i3 = vi.end();
//输出
show(vi);
//在第2个元素之前插入
vi.insert(i2, 3);
//输出
show(vi);
return 0;
}
void show(vector<int> &v)
{
cout << "size: " << v.size() << endl;
cout << "capaticy: " << v.capacity() << endl;
cout << "vector: ";
for (auto &a : v)
{
cout << a << "(" << &a << ")"
<< "\t";
}
cout << endl
<< "iterate: ";
cout << *i1 << "(" << &(*i1) << ")"
<< "\t";
cout << *i2 << "(" << &(*i2) << ")"
<< "\t";
cout << *i3 << "(" << &(*i3) << ")" //解引用尾后迭代器未定义
<< "\t";
cout << endl
<< endl;
}
análisis:
- Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
- Antes y después de los elementos de inserción, i1 siempre apunta al primer elemento del VI, y su valor no ha cambiado. Por lo tanto, I1 es aún válida.
- Antes de introducir elementos, i2 punto vi segundo elemento, * i2 = 2; después de elementos de inserción, i2 vi todavía puntos de dos elementos, pero * i2 = 3, de modo que i2 ha expirado.
- Antes de introducir elementos, punto i3 después de que el último elemento vi ausencia, * i3 es indefinido; los elementos de inserción, * i3 = 2, sin cola apuntando elemento, i3 fracaso.
4. Capacidad () suficiente de elementos aditivos en la primera porción
#include <iostream>
#include <vector>
using namespace std;
//输出
void show(vector<int> &v);
//迭代器
vector<int>::iterator i1, i2, i3;
int main()
{
vector<int> vi{1, 2};
//扩充存储空间
vi.reserve(4);
//迭代器
i1 = vi.begin();
i2 = ++vi.begin();
i3 = vi.end();
//输出
show(vi);
//在第1个元素之前插入
vi.insert(i1, 3);
//输出
show(vi);
return 0;
}
void show(vector<int> &v)
{
cout << "size: " << v.size() << endl;
cout << "capaticy: " << v.capacity() << endl;
cout << "vector: ";
for (auto &a : v)
{
cout << a << "(" << &a << ")"
<< "\t";
}
cout << endl
<< "iterate: ";
cout << *i1 << "(" << &(*i1) << ")"
<< "\t";
cout << *i2 << "(" << &(*i2) << ")"
<< "\t";
cout << *i3 << "(" << &(*i3) << ")" //解引用尾后迭代器未定义
<< "\t";
cout << endl
<< endl;
}
análisis:
- Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
- Antes y después de elementos de inserción, i1 siempre apunta a la primera elemento de VI, pero * i1 desde un 1 a 3. Por lo tanto, el fracaso i1.
- Antes y después elementos de inserción, i2 vi siempre puntos de dos elementos, pero desde el 2 * i2 se convierte en 1. Por lo tanto, el fracaso i2.
- Antes de introducir elementos, punto i3 después de que el último elemento vi ausencia, * i3 es indefinido; los elementos de inserción, * i3 = 2, sin cola apuntando elemento, i3 fracaso.
5. Resumen
1. Cuando el == capacidad size () (), el elemento de inserción en la memoria del vector se reasigna, elemento que señala iterador fallará.
2. Cuando el tamaño () <capacidad (), vector no será reasignado memoria cuando los elementos de inserción. En este momento, si el iterador con el elemento antes de la posición de inserción, todavía es válido, y si el iterador al elemento después de la posición de inserción, se desactivará.