Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Класс 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 [].
Дополнительные сведения см. в разделе Проверяемые итераторы.