Класс checked_array_iterator
Класс checked_array_iterator
предоставляет возможность преобразовать массив или указатель в проверенный итератор. Используйте этот класс в качестве оболочки (с помощью функции make_checked_array_iterator) для необработанных указателей или массивов, как способ целенаправленного выполнения проверки и управления непроверенными предупреждениями об указателях вместо глобального отключения данных предупреждений. При необходимости можно использовать непроверенную версию данного класса, unchecked_array_iterator.
Примечание.
Этот класс является расширением стандартной библиотеки C++, которое предоставляется Майкрософт. Код, реализованный с помощью этой функции, нельзя перенести в стандартные среды сборки C, не поддерживающие это расширение Microsoft. Пример создания кода, не требующего использования данного класса — это второй пример, представленный ниже.
Синтаксис
template <class _Iterator>
class checked_array_iterator;
Замечания
Этот класс определяется в пространстве имен stdext.
Дополнительные сведения и пример кода функции проверяемого итератора см. в разделе Проверяемые итераторы.
Примеры
В следующем примере показано, как задать и использовать проверенный итератор массива.
Если назначение не может вместить все скопированные элементы (например, в случае изменения строки):
copy(a, a + 5, checked_array_iterator<int*>(b, 5));
до
copy(a, a + 5, checked_array_iterator<int*>(b, 4));
Произойдет ошибка исполняющей среды.
// 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 )
*/
Чтобы исключить необходимость класса checked_array_iterator
при использовании алгоритмов стандартной библиотеки C++, попробуйте применить vector
вместо динамически выделяемого массива. В следующем примере показано, как это сделать.
// 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
*/
Конструкторы
Конструктор | Description |
---|---|
checked_array_iterator | Формирование итератора checked_array_iterator по умолчанию или итератора checked_array_iterator из базового итератора. |
Определения типов
Введите имя | Description |
---|---|
difference_type | Тип, обеспечивающий разницу между двумя итераторами checked_array_iterator , которые ссылаются на элементы в одном контейнере. |
pointer | Тип, содержащий указатель на элемент, к которому обращается итератор checked_array_iterator . |
reference | Тип, содержащий ссылку на элемент, к которому обращается итератор checked_array_iterator . |
Функции элементов
Функция-член | Description |
---|---|
base | Восстановление базового итератора из соответствующего итератора checked_array_iterator . |
Операторы
Operator | Description |
---|---|
operator== | Проверка двух итераторов checked_array_iterator на равенство. |
оператор!= | Проверка двух итераторов checked_array_iterator на неравенство. |
operator< | Проверка на то, что итератор checked_array_iterator с левой стороны оператора меньше итератора checked_array_iterator с правой стороны. |
operator> | Проверка на то, что итератор checked_array_iterator с левой стороны оператора больше итератора checked_array_iterator с правой стороны. |
operator<= | Проверка на то, что итератор checked_array_iterator с левой стороны оператора меньше или равен итератору checked_array_iterator с правой стороны. |
operator>= | Проверка на то, что итератор checked_array_iterator с левой стороны оператора больше или равен итератора checked_array_iterator с правой стороны. |
operator* | Возвращение элемента, к которому обращается checked_array_iterator . |
operator-> | Возвращение указателя на элемент, к которому обращается checked_array_iterator . |
оператор++ | Увеличение checked_array_iterator до следующего элемента. |
оператор-- | Уменьшение checked_array_iterator до предыдущего элемента. |
оператор+= | Добавление заданного смещения к итератору checked_array_iterator . |
operator+ | Добавление смещения к итератору и возврат нового итератора checked_array_iterator , который обращается к вставленному элементу в новой позиции смещения. |
operator-= | Уменьшение заданного смещения из checked_array_iterator . |
operator- | Уменьшение смещения из итератора и возврат нового итератора checked_array_iterator , который обращается к вставленному элементу в новой позиции смещения. |
operator[] |
Возврат ссылки на смещение элемента из элемента, к которому обращается checked_array_iterator , на указанное число позиций. |
Требования
Заголовок:<итератор>
Пространство имен: stdext
checked_array_iterator::base
Восстановление базового итератора из соответствующего итератора checked_array_iterator
.
_Iterator base() const;
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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
Формирование итератора checked_array_iterator
по умолчанию или итератора checked_array _iterator
из базового итератора.
checked_array_iterator();
checked_array_iterator(
ITerator ptr,
size_t size,
size_t index = 0);
Параметры
ptr
Указатель на массив.
size
Размер массива.
index
Элемент в массиве для инициализации итератора (необязательно). По умолчанию итератор инициализируется первым элементом в массиве.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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 ifference_type
Тип, обеспечивающий разницу между двумя итераторами checked_array_iterator
, которые ссылаются на элементы в одном контейнере.
typedef typename iterator_traits<_Iterator>::difference_type difference_type;
Замечания
Тип отличия checked_array_iterator
совпадает с типом отличия итератора.
Пример кода см. в разделе checked_array_iterator::operator [].
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::operator==
Проверка двух итераторов checked_array_iterator
на равенство.
bool operator==(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, по которому выполняется проверка на равенство.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator!=
Проверка двух итераторов checked_array_iterator
на неравенство.
bool operator!=(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, по которому выполняется проверка на неравенство.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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<
Проверка на то, что итератор checked_array_iterator
с левой стороны оператора меньше итератора checked_array_iterator
с правой стороны.
bool operator<(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, по которому выполняется проверка на неравенство.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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>
Проверка на то, что итератор checked_array_iterator
с левой стороны оператора больше итератора checked_array_iterator
с правой стороны.
bool operator>(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, с которым выполняется сравнение.
Замечания
См checked_array_iterator::operator<
. пример кода.
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::operator<=
Проверка на то, что итератор checked_array_iterator
с левой стороны оператора меньше или равен итератору checked_array_iterator
с правой стороны.
bool operator<=(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, с которым выполняется сравнение.
Замечания
См checked_array_iterator::operator>=
. пример кода.
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::operator>=
Проверка на то, что итератор checked_array_iterator
с левой стороны оператора больше или равен итератора checked_array_iterator
с правой стороны.
bool operator>=(const checked_array_iterator<_Iterator>& right) const;
Параметры
right
Итератор checked_array_iterator
, с которым выполняется сравнение.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator*
Возвращение элемента, к которому обращается checked_array_iterator
.
reference operator*() const;
Возвращаемое значение
Значение элемента, найденного итератором checked_array_iterator
.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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->
Возвращение указателя на элемент, к которому обращается checked_array_iterator
.
pointer operator->() const;
Возвращаемое значение
Указатель на элемент, к которому обращается checked_array_iterator
.
Замечания
Пример кода см. в разделе checked_array_iterator::operator.
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::operator++
Увеличение checked_array_iterator
до следующего элемента.
checked_array_iterator& operator++();
checked_array_iterator<_Iterator> operator++(int);
Возвращаемое значение
Первый оператор возвращает предварительно увеличенный checked_array_iterator
, а второй, постинкрементный оператор, возвращает копию увеличенного checked_array_iterator
.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator--
Уменьшение checked_array_iterator
до предыдущего элемента.
checked_array_iterator<_Iterator>& operator--();
checked_array_iterator<_Iterator> operator--(int);
Возвращаемое значение
Первый оператор возвращает предварительно уменьшенный checked_array_iterator
, а второй, постдекрементный оператор, возвращает копию уменьшенного checked_array_iterator
.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator+=
Добавление заданного смещения к итератору checked_array_iterator
.
checked_array_iterator<_Iterator>& operator+=(difference_type _Off);
Параметры
_От
Смещение, на которое необходимо увеличить итератор.
Возвращаемое значение
Ссылка на элемент, к которому обращается checked_array_iterator
.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator+
Добавление смещения к итератору и возврат нового итератора checked_array_iterator
, который обращается к вставленному элементу в новой позиции смещения.
checked_array_iterator<_Iterator> operator+(difference_type _Off) const;
Параметры
_От
Смещение для добавления к checked_array_iterator
.
Возвращаемое значение
Объект checked_array_iterator
, который обращается к элементу смещения.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator-=
Уменьшение заданного смещения из checked_array_iterator
.
checked_array_iterator<_Iterator>& operator-=(difference_type _Off);
Параметры
_От
Смещение, на которое необходимо увеличить итератор.
Возвращаемое значение
Ссылка на элемент, к которому обращается checked_array_iterator
.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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::operator-
Уменьшение смещения из итератора и возврат нового итератора checked_array_iterator
, который обращается к вставленному элементу в новой позиции смещения.
checked_array_iterator<_Iterator> operator-(difference_type _Off) const;
difference_type operator-(const checked_array_iterator& right) const;
Параметры
_От
Смещение, на которое необходимо уменьшить checked_array_iterator
.
Возвращаемое значение
Объект checked_array_iterator
, который обращается к элементу смещения.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::operator[]
Возврат ссылки на смещение элемента из элемента, к которому обращается checked_array_iterator
, на указанное число позиций.
reference operator[](difference_type _Off) const;
Параметры
_От
Смещение от адреса checked_array_iterator
.
Возвращаемое значение
Ссылка на смещение элемента.
Замечания
Дополнительные сведения см. в разделе Проверяемые итераторы.
Пример
// 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
Тип, содержащий указатель на элемент, к которому обращается итератор checked_array_iterator
.
typedef typename iterator_traits<_Iterator>::pointer pointer;
Замечания
Пример кода см. в разделе checked_array_iterator::operator*.
Дополнительные сведения см. в разделе Проверяемые итераторы.
checked_array_iterator::reference
Тип, содержащий ссылку на элемент, к которому обращается итератор checked_array_iterator
.
typedef typename iterator_traits<_Iterator>::reference reference;
Замечания
Пример кода см. в разделе checked_array_iterator::operator [].
Дополнительные сведения см. в разделе Проверяемые итераторы.