C ++: vector iterador invalidación cuando los elementos de inserto



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;
}

Los resultados operativos
elementos de la figura de inserción antes y después de la comparación
análisis:

  1. 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.
  2. 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.
  3. 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;
}

Los resultados operativos

elementos de la figura de inserción antes y después de la comparación

análisis:

  1. Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
  2. 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.
  3. 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;
}

Los resultados operativos

elementos de la figura de inserción antes y después de la comparación

análisis:

  1. Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
  2. 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.
  3. 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.
  4. 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;
}

Los resultados operativos

elementos de la figura de inserción antes y después de la comparación

análisis:

  1. Debido a que, por lo que los elementos de inserción, de direcciones de memoria vector sin cambios el tamaño () <capacidad ().
  2. 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.
  3. 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.
  4. 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á.

Publicado 77 artículos originales · ganado elogios 25 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_34801642/article/details/105142401
Recomendado
Clasificación