Compartilhar via


Classe checked_array_iterator

A classe checked_array_iterator permite que você transforme uma matriz ou um ponteiro em um iterador verificado. Use essa classe como um wrapper (usando a função make_checked_array_iterator) para matrizes ou ponteiros brutos como uma maneira direcionada de fornecer verificação e gerenciar avisos de ponteiros não verificados, em vez de silenciar esses avisos globalmente. Se necessário, você pode usar a versão não verificada da classe, unchecked_array_iterator.

Observação

Essa classe é uma extensão da Microsoft da Biblioteca Padrão C++. O código implementado usando essa função não é portátil para ambientes de criação do C++ Standard que não oferecem suporte a essa extensão da Microsoft. Para ver um exemplo que demonstra como escrever código que não exige uso dessa classe, veja o segundo exemplo abaixo.

Sintaxe

template <class _Iterator>
class checked_array_iterator;

Comentários

Essa classe é definida no namespace stdext.

Para obter mais informações e o código de exemplo sobre o recurso de iterador verificado, consulte Iteradores verificados.

Exemplos

O exemplo a seguir mostra como definir e usar um iterador de matriz verificado.

Se o destino não for grande o suficiente para armazenar todos os elementos que estão sendo copiados, como seria se você tivesse alterado a linha:

copy(a, a + 5, checked_array_iterator<int*>(b, 5));

até

copy(a, a + 5, checked_array_iterator<int*>(b, 4));

Ocorrerá um erro de runtime.

// compile with: /EHsc /W4 /MTd
#include <algorithm>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[]={0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b, 5));

   cout << "(";
   for (int i = 0 ; i < 5 ; i++)
      cout << " " << b[i];
   cout << " )" << endl;

   // constructor example
   checked_array_iterator<int*> checked_out_iter(b, 5);
   copy(a, a + 5, checked_out_iter);

   cout << "(";
   for (int i = 0 ; i < 5 ; i++)
      cout << " " << b[i];
   cout << " )" << endl;
}
/* Output:
( 0 1 2 3 4 )
( 0 1 2 3 4 )
*/

Para evitar a necessidade da classe checked_array_iterator ao usar algoritmos da Biblioteca Padrão C++, pense em usar um vector, em vez de uma matriz dinamicamente alocada. O exemplo a seguir demonstra como fazer isso.

// compile with: /EHsc /W4 /MTd

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    std::vector<int> v(10);
    int *arr = new int[10];
    for (int i = 0; i < 10; ++i)
    {
        v[i] = i;
        arr[i] = i;
    }

    // std::copy(v.begin(), v.end(), arr); will result in
    // warning C4996. To avoid this warning while using int *,
    // use the Microsoft extension checked_array_iterator.
    std::copy(v.begin(), v.end(),
              stdext::checked_array_iterator<int *>(arr, 10));

    // Instead of using stdext::checked_array_iterator and int *,
    // consider using std::vector to encapsulate the array. This will
    // result in no warnings, and the code will be portable.
    std::vector<int> arr2(10);    // Similar to int *arr = new int[10];
    std::copy(v.begin(), v.end(), arr2.begin());

    for (int j = 0; j < arr2.size(); ++j)
    {
        cout << " " << arr2[j];
    }
    cout << endl;

    return 0;
}
/* Output:
0 1 2 3 4 5 6 7 8 9
*/

Construtores

Construtor Descrição
checked_array_iterator Constrói um checked_array_iterator padrão ou um checked_array_iterator de um iterador subjacente.

Typedefs

Nome do tipo Descrição
difference_type Um tipo que fornece a diferença entre dois checked_array_iterators que se referem a elementos no mesmo contêiner.
pointer Um tipo que fornece um ponteiro para um elemento tratado por um checked_array_iterator.
referência Um tipo que fornece uma referência a um elemento tratado por um checked_array_iterator.

Funções de membro

Função de membro Descrição
base Recupera o iterador subjacente de seu checked_array_iterator.

Operadores

Operador Descrição
operator== Testa a igualdade de dois checked_array_iterators.
operator!= Testa a desigualdade de dois checked_array_iterators.
operator< Testa se o checked_array_iterator à esquerda do operador é menor que o checked_array_iterator à direita.
operator> Testa se o checked_array_iterator à esquerda do operador é maior que o checked_array_iterator à direita.
operator<= Testa se o checked_array_iterator à esquerda do operador é menor ou igual ao checked_array_iterator à direita.
operator>= Testa se o checked_array_iterator à esquerda do operador é maior ou igual ao checked_array_iterator à direita.
operator* Retorna o elemento tratado por um checked_array_iterator.
operator-> Retorna um ponteiro para o elemento tratado pelo checked_array_iterator.
operadora++ Incrementa o checked_array_iterator até o próximo elemento.
operador-- Decrementa o checked_array_iterator para o elemento anterior.
operator+= Adiciona um deslocamento especificado para um checked_array_iterator.
operator+ Adiciona um deslocamento a um iterador e retorna o novo checked_array_iterator que trata o elemento inserido na nova posição de deslocamento.
operador-= Decrementa um deslocamento especificado de um checked_array_iterator.
operator- Decrementa um deslocamento de um iterador e retorna o novo checked_array_iterator que trata o elemento inserido na nova posição de deslocamento.
operator[] Retorna uma referência a um deslocamento do elemento tratado por um checked_array_iterator por um número especificado de posições.

Requisitos

Cabeçalho:<iterator>

Namespace: stdext

checked_array_iterator::base

Recupera o iterador subjacente de seu checked_array_iterator.

_Iterator base() const;

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_base.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main() {
   using namespace std;

   int V1[10];

   for (int i = 0; i < 10 ; i++)
      V1[i] = i;

   int* bpos;

   stdext::checked_array_iterator<int*> rpos(V1, 10);
   rpos++;

   bpos = rpos.base ( );
   cout << "The iterator underlying rpos is bpos & it points to: "
        << *bpos << "." << endl;
}
/* Output:
The iterator underlying rpos is bpos & it points to: 1.
*/

checked_array_iterator::checked_array_iterator

Constrói um checked_array_iterator padrão ou um checked_array _iterator de um iterador subjacente.

checked_array_iterator();

checked_array_iterator(
    ITerator ptr,
    size_t size,
    size_t index = 0);

Parâmetros

ptr
Um ponteiro para a matriz.

size
O tamanho da matriz.

index
(Opcional) Um elemento na matriz para inicializar o iterador. Por padrão, o iterador é inicializado para o primeiro elemento na matriz.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_ctor.cpp
// compile with: /EHsc
#include <iterator>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   for (int i = 0 ; i < 5 ; i++)
      cout << b[i] << " ";
   cout << endl;

   checked_array_iterator<int*> checked_output_iterator(b,5);
   copy (a, a + 5, checked_output_iterator);
   for (int i = 0 ; i < 5 ; i++)
      cout << b[i] << " ";
   cout << endl;

   checked_array_iterator<int*> checked_output_iterator2(b,5,3);
   cout << *checked_output_iterator2 << endl;
}
/* Output:
0 1 2 3 4
0 1 2 3 4
3
*/

checked_array_iterator::d tipo_ifference

Um tipo que fornece a diferença entre dois checked_array_iterators que se referem a elementos no mesmo contêiner.

typedef typename iterator_traits<_Iterator>::difference_type difference_type;

Comentários

O tipo de diferença checked_array_iterator é o mesmo que o tipo de diferença do iterador.

Consulte um exemplo de código em checked_array_iterator::operator[].

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::operador==

Testa a igualdade de dois checked_array_iterators.

bool operator==(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com relação ao qual verificar quanto à igualdade.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_opeq.cpp
// compile with: /EHsc
#include <iterator>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);
   checked_array_iterator<int*> checked_output_iterator2(b,5);

   if (checked_output_iterator2 == checked_output_iterator)
      cout << "checked_array_iterators are equal" << endl;
   else
      cout << "checked_array_iterators are not equal" << endl;

   copy (a, a + 5, checked_output_iterator);
   checked_output_iterator++;

   if (checked_output_iterator2 == checked_output_iterator)
      cout << "checked_array_iterators are equal" << endl;
   else
      cout << "checked_array_iterators are not equal" << endl;
}
/* Output:
checked_array_iterators are equal
checked_array_iterators are not equal
*/

checked_array_iterator::operador!=

Testa a desigualdade de dois checked_array_iterators.

bool operator!=(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com relação ao qual verificar quanto à desigualdade.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_opneq.cpp
// compile with: /EHsc
#include <iterator>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);
   checked_array_iterator<int*> checked_output_iterator2(b,5);

   if (checked_output_iterator2 != checked_output_iterator)
      cout << "checked_array_iterators are not equal" << endl;
   else
      cout << "checked_array_iterators are equal" << endl;

   copy (a, a + 5, checked_output_iterator);
   checked_output_iterator++;

   if (checked_output_iterator2 != checked_output_iterator)
      cout << "checked_array_iterators are not equal" << endl;
   else
      cout << "checked_array_iterators are equal" << endl;
}
/* Output:
checked_array_iterators are equal
checked_array_iterators are not equal
*/

checked_array_iterator::operator<

Testa se o checked_array_iterator à esquerda do operador é menor que o checked_array_iterator à direita.

bool operator<(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com relação ao qual verificar quanto à desigualdade.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_oplt.cpp
// compile with: /EHsc
#include <iterator>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);
   checked_array_iterator<int*> checked_output_iterator2(b,5);

   if (checked_output_iterator2 < checked_output_iterator)
      cout << "checked_output_iterator2 is less than checked_output_iterator" << endl;
   else
      cout << "checked_output_iterator2 is not less than checked_output_iterator" << endl;

   copy (a, a + 5, checked_output_iterator);
   checked_output_iterator++;

   if (checked_output_iterator2 < checked_output_iterator)
      cout << "checked_output_iterator2 is less than checked_output_iterator" << endl;
   else
      cout << "checked_output_iterator2 is not less than checked_output_iterator" << endl;
}
/* Output:
checked_output_iterator2 is not less than checked_output_iterator
checked_output_iterator2 is less than checked_output_iterator
*/

checked_array_iterator::operator>

Testa se o checked_array_iterator à esquerda do operador é maior que o checked_array_iterator à direita.

bool operator>(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com o qual comparar.

Comentários

Consulte checked_array_iterator::operator< para obter um exemplo de código.

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::operator<=

Testa se o checked_array_iterator à esquerda do operador é menor ou igual ao checked_array_iterator à direita.

bool operator<=(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com o qual comparar.

Comentários

Consulte checked_array_iterator::operator>= para obter um exemplo de código.

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::operator>=

Testa se o checked_array_iterator à esquerda do operador é maior ou igual ao checked_array_iterator à direita.

bool operator>=(const checked_array_iterator<_Iterator>& right) const;

Parâmetros

direita
O checked_array_iterator com o qual comparar.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_opgteq.cpp
// compile with: /EHsc
#include <iterator>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);
   checked_array_iterator<int*> checked_output_iterator2(b,5);

   if (checked_output_iterator2 >= checked_output_iterator)
      cout << "checked_output_iterator2 is greater than or equal to checked_output_iterator" << endl;
   else
      cout << "checked_output_iterator2 is less than checked_output_iterator" << endl;

   copy (a, a + 5, checked_output_iterator);
   checked_output_iterator++;

   if (checked_output_iterator2 >= checked_output_iterator)
      cout << "checked_output_iterator2 is greater than or equal to checked_output_iterator" << endl;
   else
      cout << "checked_output_iterator2 is less than checked_output_iterator" << endl;
}
/* Output:
checked_output_iterator2 is greater than or equal to checked_output_iterator
checked_output_iterator2 is less than checked_output_iterator
*/

checked_array_iterator::operador*

Retorna o elemento tratado por um checked_array_iterator.

reference operator*() const;

Valor de Devolução

O valor do elemento abordado por checked_array_iterator.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterator_pointer.cpp
// compile with: /EHsc
#include <iterator>
#include <algorithm>
#include <vector>
#include <utility>
#include <iostream>

using namespace std;
using namespace stdext;

int main() {
   int a[] = {0, 1, 2, 3, 4};
   int b[5];
   pair<int, int> c[1];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   for (int i = 0 ; i < 5 ; i++)
      cout << b[i] << endl;

    c[0].first = 10;
    c[0].second = 20;

   checked_array_iterator<int*> checked_output_iterator(b,5);
   checked_array_iterator<int*>::pointer p = &(*checked_output_iterator);
   checked_array_iterator<pair<int, int>*> chk_c(c, 1);
   checked_array_iterator<pair<int, int>*>::pointer p_c = &(*chk_c);

   cout << "b[0] = " << *p << endl;
   cout << "c[0].first = " << p_c->first << endl;
}
/* Output:
0
1
2
3
4
b[0] = 0
c[0].first = 10
*/

checked_array_iterator::operator->

Retorna um ponteiro para o elemento tratado pelo checked_array_iterator.

pointer operator->() const;

Valor de Devolução

Um ponteiro para o elemento tratado pelo checked_array_iterator.

Comentários

Consulte checked_array_iterator::pointer para obter um exemplo de código.

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::Operador++

Incrementa o checked_array_iterator até o próximo elemento.

checked_array_iterator& operator++();

checked_array_iterator<_Iterator> operator++(int);

Valor de Devolução

O primeiro operador retorna o checked_array_iterator pré-incrementado e o segundo, o operador pós-incrementado, retorna uma cópia do checked_array_iterator incrementado.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_plus_plus.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace stdext;
   using namespace std;
   int a[] = {6, 3, 77, 199, 222};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);

   cout << *checked_output_iterator << endl;
   ++checked_output_iterator;
   cout << *checked_output_iterator << endl;
   checked_output_iterator++;
   cout << *checked_output_iterator << endl;
}
/* Output:
6
3
77
*/

checked_array_iterator::operador--

Decrementa o checked_array_iterator para o elemento anterior.

checked_array_iterator<_Iterator>& operator--();

checked_array_iterator<_Iterator> operator--(int);

Valor de Devolução

O primeiro operador retorna o checked_array_iterator pré-decrementado e o segundo, o operador pós-decrementado, retorna uma cópia do checked_array_iterator decrementado.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_minus_minus.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace stdext;
   using namespace std;
   int a[] = {6, 3, 77, 199, 222};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);

   cout << *checked_output_iterator << endl;
   checked_output_iterator++;
   cout << *checked_output_iterator << endl;
   checked_output_iterator--;
   cout << *checked_output_iterator << endl;
}
/* Output:
6
3
6
*/

checked_array_iterator::operador+=

Adiciona um deslocamento especificado para um checked_array_iterator.

checked_array_iterator<_Iterator>& operator+=(difference_type _Off);

Parâmetros

_Off
O deslocamento pelo qual incrementar o iterador.

Valor de Devolução

Uma referência ao elemento tratado pelo checked_array_iterator.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_plus_eq.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace stdext;
   using namespace std;
   int a[] = {6, 3, 77, 199, 222};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);

   cout << *checked_output_iterator << endl;
   checked_output_iterator += 3;
   cout << *checked_output_iterator << endl;
}
/* Output:
6
199
*/

checked_array_iterator::operador+

Adiciona um deslocamento a um iterador e retorna o novo checked_array_iterator que trata o elemento inserido na nova posição de deslocamento.

checked_array_iterator<_Iterator> operator+(difference_type _Off) const;

Parâmetros

_Off
O deslocamento a ser adicionado a checked_array_iterator.

Valor de Devolução

Um checked_array_iterator que trata o elemento de deslocamento.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_plus.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace stdext;
   using namespace std;
   int a[] = {6, 3, 77, 199, 222};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);

   cout << *checked_output_iterator << endl;
   checked_output_iterator = checked_output_iterator + 3;
   cout << *checked_output_iterator << endl;
}
/* Output:
6
199
*/

checked_array_iterator::operador-=

Decrementa um deslocamento especificado de um checked_array_iterator.

checked_array_iterator<_Iterator>& operator-=(difference_type _Off);

Parâmetros

_Off
O deslocamento pelo qual incrementar o iterador.

Valor de Devolução

Uma referência ao elemento tratado pelo checked_array_iterator.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_minus_eq.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace stdext;
   using namespace std;
   int a[] = {6, 3, 77, 199, 222};
   int b[5];
   copy(a, a + 5, checked_array_iterator<int*>(b,5));

   checked_array_iterator<int*> checked_output_iterator(b,5);

   checked_output_iterator += 3;
   cout << *checked_output_iterator << endl;
   checked_output_iterator -= 2;
   cout << *checked_output_iterator << endl;
}
/* Output:
199
3
*/

checked_array_iterator::operador-

Decrementa um deslocamento de um iterador e retorna o novo checked_array_iterator que trata o elemento inserido na nova posição de deslocamento.

checked_array_iterator<_Iterator> operator-(difference_type _Off) const;

difference_type operator-(const checked_array_iterator& right) const;

Parâmetros

_Off
O deslocamento a ser decrementado do checked_array_iterator.

Valor de Devolução

Um checked_array_iterator que trata o elemento de deslocamento.

Comentários

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::operador[]

Retorna uma referência a um deslocamento do elemento tratado por um checked_array_iterator por um número especificado de posições.

reference operator[](difference_type _Off) const;

Parâmetros

_Off
O deslocamento do endereço checked_array_iterator.

Valor de Devolução

A referência ao deslocamento de elemento.

Comentários

Para obter mais informações, consulte Iteradores verificados.

Exemplo

// checked_array_iterators_op_diff.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace std;
   int V1[10];

   for (int i = 0; i < 10 ; i++)
      V1[i] = i;

   // Declare a difference type for a parameter
   stdext::checked_array_iterator<int*>::difference_type diff = 2;

   stdext::checked_array_iterator<int*> VChkIter(V1, 10);

   stdext::checked_array_iterator<int*>::reference refrpos = VChkIter [diff];

   cout << refrpos + 1 << endl;
}
/* Output:
3
*/

checked_array_iterator::p ointer

Um tipo que fornece um ponteiro para um elemento tratado por um checked_array_iterator.

typedef typename iterator_traits<_Iterator>::pointer pointer;

Comentários

Consulte um exemplo de código em checked_array_iterator::operator*.

Para obter mais informações, consulte Iteradores verificados.

checked_array_iterator::referência

Um tipo que fornece uma referência a um elemento tratado por um checked_array_iterator.

typedef typename iterator_traits<_Iterator>::reference reference;

Comentários

Consulte um exemplo de código em checked_array_iterator::operator[].

Para obter mais informações, consulte Iteradores verificados.

Confira também

<iterator>
Referência da biblioteca padrão C++