Distance c что это
Перейти к содержимому

Distance c что это

std :: distance в C ++

Это имеет важную особенность, так же как у нас есть векторы в науке, которые имеют и величину, и направление, std :: distance также имеет направление, связанное с ним. Это означает, что вычисление расстояния между первым и последним, а затем вычисление расстояния между последним и первым не будет таким же, как во втором случае, с ним будет связан отрицательный знак, поскольку мы движемся назад.

Синтаксис:

Пример:

// C ++ программа для демонстрации std :: distance ()
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

for (i = 0; i < 10; ++i)

/ * v содержит 0 1 2 3 4 5 6 7 8 9 * /

vector< int >::iterator first;

vector< int >::iterator last;

// сначала указывает на 0

// последний указатель на 5

last = v.begin() + 5;

// Расчет нет. элементов между первым и последним

int num = std::distance(first, last);

Что происходит, когда мы пересматриваем порядок при расчете расстояния?

Так как он считает нет. элементов между двумя входными итераторами следует иметь в виду, что при подсчете расстояния он не учитывает элемент, на который указывает последний (если он есть), тогда как элемент, на который указывает первый, считается в диапазоне i это [первый, последний).

// C ++ программа для демонстрации использования std :: distance
// с обратным порядком
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

for (i = 0; i < 10; ++i)

// Расчет нет. элементов в векторе v

int num = std::distance(v.begin(), v.end());

// Расчет в обратном порядке

num = std::distance(v.end(), v.begin());

Здесь общее количество элементов между первым (указывающим на 0) и последним (указывающим на 5) равно 5, т. Е. 0 1 2 3 4. Таким образом, элемент, на который указывает последний, не был подсчитан функцией distance ().

Сложность времени: постоянная для итераторов с произвольным доступом и O (n) для всех других итераторов.

Эта статья предоставлена Мригендрой Сингх . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Функции <iterator>

Увеличивает итератор на указанное количество позиций.

Параметры

Init
Итератор, который должен увеличен, должен удовлетворять требованиям для итератора ввода.

Выключено
Целочисленный тип, который можно преобразовать в тип отличия итератора, указывающий число приращений позиции итератора, необходимо сдвинуть вперед.

Remarks

Диапазон сдвижения должен быть несингулярным, а итераторы должны поддерживать удаление ссылок или находиться за пределами диапазона.

Если требования InputIterator к двунаправленному итератору соответствуют требованиям, выкл . Если InputIterator является типом входного или прямого итератора, значение Off должно быть неотрицательным.

Функция advance имеет постоянную сложность при InputIterator удовлетворении требований к итератору произвольного доступа; в противном случае она имеет линейную сложность и поэтому потенциально дорого.

Пример

back_inserter

Создает итератор, может вставлять элементы с обратной стороны указанного контейнера.

Параметры

_Cont
Контейнер, в который будет выполняться вставка с обратной стороны.

Возвращаемое значение

Связанный back_insert_iterator с объектом контейнера _Cont.

Remarks

В стандартной библиотеке C++ аргумент должен ссылаться на один из трех контейнеров последовательности, которые имеют функцию-член push_back : класс deque, класс list или класс vector.

Пример

begin

Извлекает итератор для первого элемента в указанном контейнере.

Параметры

array.
Массив объектов перечисления Ty .

Возвращаемое значение

Первые две функции шаблона возвращают cont.begin() . Первая функция не является константой; вторая является константой.

Третья функция шаблона возвращает массив.

Пример

Рекомендуется использовать эту же функцию шаблона вместо члена контейнера begin() , если требуется более стандартное поведение.

Функция reverse_sort поддерживает контейнеры любого типа, кроме обычных массивов, поскольку она обращается к версиям begin() , не являющимся членами. Если reverse_sort было написано для использования члена контейнера begin() , выполните следующие действия.

Тогда отправка массива в данный контейнер вызовет следующую ошибку компилятора:

cbegin

Извлекает итератор const для первого элемента в указанном контейнере.

Параметры

Продолжение
Контейнер или initializer_list.

Возвращаемое значение

Remarks

Эта функция работает со всеми контейнерами стандартной библиотеки С++ и с initializer_list.

Эту функцию-член можно использовать вместо функции шаблона begin() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Обычно используется вместе с ключевым словом вывода типа auto, как показано в следующем примере. В этом примере предположим, что Container является изменяемым контейнером (не const ) или initializer_list любого типа, который поддерживает begin() и cbegin() .

Извлекает итератор const для элемента, следующего за последним элементом в указанном контейнере.

Параметры

Продолжение
Контейнер или initializer_list.

Возвращаемое значение

Remarks

Эта функция работает со всеми контейнерами стандартной библиотеки С++ и с initializer_list.

Эту функцию-член можно использовать вместо функции шаблона end(), чтобы гарантировать, что возвращаемое значение будет const_iterator . Обычно используется вместе с ключевым словом вывода типа auto, как показано в следующем примере. В этом примере предположим, что Container является изменяемым контейнером (не const ) или initializer_list любого типа, который поддерживает end() и cend() .

crbegin

crend

distance

Указывает количество приращений между позициями, которые адресуют два итератора.

Параметры

first
Первый итератор, для которого нужно определить расстояние до второго.

last
Второй итератор, для которого нужно определить расстояние от первого.

Возвращаемое значение

Число раз, которое сначала необходимо увеличить до тех пор, пока не будет равно последней.

Remarks

Функция расстояния имеет постоянную сложность при InputIterator удовлетворении требований к итератору произвольного доступа; в противном случае она имеет линейную сложность и поэтому потенциально дорого.

Пример

empty

Извлекает итератор для элемента, следующего за последним элементом в указанном контейнере.

Параметры

array.
Массив объектов перечисления Ty .

Возвращаемое значение

Первые две функции шаблона возвращают cont.end() (первая не является константой, вторая является константой).

Третья функция шаблона возвращает array + Size .

Remarks

Пример кода см. в разделе begin.

front_inserter

Создает итератор, может вставлять элементы с передней стороны указанного контейнера.

Параметры

_Cont
Объект-контейнер, для которого выполняется вставка элемента в переднюю часть.

Возвращаемое значение

Связанный front_insert_iterator с объектом контейнера _Cont.

Remarks

Функция-член front_insert_iterator класса front_insert_iterator также может использоваться.

В стандартной библиотеке C++ аргумент должен ссылаться на один из двух контейнеров последовательности, которые имеют функцию-член push_back : класс deque или «класс list».

Пример

inserter

Вспомогающая функция шаблона, которая позволяет использовать inserter(_Cont, _Where) вместо insert_iterator<Container>(_Cont, _Where) .

Параметры

_Cont
Контейнер, в который будут добавляться новые элементы.

_Where
Итератор, обнаруживающий точку вставки.

Remarks

Функция шаблона возвращает insert_iterator <Container>(_Cont, _Where) .

Пример

make_checked_array_iterator

Создает checked_array_iterator, который может использоваться другими алгоритмами.

Эта функция — расширение Майкрософт для стандартной библиотеки C++. Код, реализованный с помощью этой функции, нельзя перенести в стандартные среды сборки C, не поддерживающие это расширение Microsoft.

Параметры

Ptr
Указатель на массив назначения.

Размер
Размер массива назначения.

Index
Необязательный индекс массива.

Возвращаемое значение

Remarks

Функция make_checked_array_iterator задается в пространстве имен stdext .

Эта функция принимает необработанный указатель, который в обычном случае вызывает проблемы, связанные с выходом за границы, и помещает его в оболочку класса checked_array_iterator, который выполняет проверку. Так как этот класс помечен как проверенный, стандартная библиотека С++ не выдает предупреждение о нем. Дополнительные сведения и примеры кода см. в разделе Проверенные итераторы.

Пример

В следующем примере создается и заполняется 10 элементами вектор. Содержимое вектора копируется в массив с помощью алгоритма копирования, а затем make_checked_array_iterator используется для указания назначения. Затем осуществляется проверка на преднамеренное нарушение границ для активации сбоя подтверждения отладки.

make_move_iterator

Создает move iterator , содержащий предоставленный итератор в качестве итератора stored .

Параметры

_It
Итератор, хранящийся в новом итераторе перемещения.

Remarks

Функция шаблона возвращает . move_iterator <Iterator>(_It)

make_unchecked_array_iterator

Создает unchecked_array_iterator, который может использоваться другими алгоритмами.

Эта функция — расширение Майкрософт для стандартной библиотеки C++. Код, реализованный с помощью этой функции, нельзя перенести в стандартные среды сборки C, не поддерживающие это расширение Microsoft.

Параметры

Ptr
Указатель на массив назначения.

Возвращаемое значение

Remarks

Функция make_unchecked_array_iterator задается в пространстве имен stdext .

Эта функция принимает необработанный указатель и помещает его в класс, который не выполняет проверки, и поэтому оптимизирует к минимуму, но также подавляет предупреждения компилятора, например C4996. Соответственно, это целевой способ работы с предупреждениями непроверенных указателей без их глобального подавления или возникновения стоимости проверки. Дополнительные сведения и примеры кода см. в разделе Проверенные итераторы.

Пример

В следующем примере создается и заполняется 10 элементами вектор. Содержимое вектора копируется в массив с помощью алгоритма копирования, а затем make_unchecked_array_iterator используется для указания назначения.

Далее

Выполняет итерацию заданное число раз и возвращает новую позицию итератора.

Параметры

first
Текущая позиция.

_Off
Количество раз для прохода.

Возвращаемое значение

Возвращает новое положение итератора после итерации _Off раз.

Remarks

Функция-шаблон возвращает next добавочные _Off раз

Выполняет обратную итерацию заданное число раз и возвращает новую позицию итератора.

How to understand std::distance in C++?

user avatar

The distance(first, last) function tells you how many items are between the iterator at first and last . Note that pointers are iterators, random-access iterators to be specific. So the distance between one pointer and another is their difference, as defined by operator- .

So your question boils down to «How many ints are there between the int pointed to by B and the int pointed to by C ?

distance dutifully subtracts the pointers and tells you.

The trick is that distance is supposed to be applied to iterators from the same container. Your code does not live up to that promise. The compiler is free to place the B and C arrays wherever it pleases, hence the result you see is meaningless. Like many things in C++, it’s up to you to ensure that you’re using distance properly. If you don’t, you’ll get undefined behavior, where the language makes no guarantees what will happen.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *