Преобразование позиций в стиле итератора в позиции в стиле Size_Type: методы и примеры

Введение

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

Метод 1: использование std::distance

Функция

из библиотеки <iterator>. Функция std::distanceпринимает в качестве аргументов два итератора и возвращает количество элементов между ними. Вот пример:

#include <iostream>
#include <vector>
#include <iterator>
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // Get iterator to the third element
    std::vector<int>::iterator it = numbers.begin() + 2;
    // Translate iterator-style position to size_type-style position
    std::vector<int>::size_type pos = std::distance(numbers.begin(), it);
    std::cout << "Position: " << pos << std::endl;
    return 0;
}

Выход:

Position: 2

Метод 2: использование std::advance

Функция

из библиотеки <iterator>. Функция std::advanceперемещает итератор на указанное количество шагов. Вот пример:

#include <iostream>
#include <vector>
#include <iterator>
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // Get iterator to the third element
    std::vector<int>::iterator it = numbers.begin() + 2;
    // Translate iterator-style position to size_type-style position
    std::vector<int>::size_type pos = std::distance(numbers.begin(), it);
    std::cout << "Position: " << pos << std::endl;
    return 0;
}

Выход:

Position: 2

Метод 3: использование std::next

В C++11 и более поздних версиях вы также можете использовать функцию std::nextиз библиотеки <iterator>для получения итератора в указанной позиции. Затем вы можете использовать std::distanceдля вычисления позиции в стиле size_type. Вот пример:

#include <iostream>
#include <vector>
#include <iterator>
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // Get iterator to the third element using std::next
    std::vector<int>::iterator it = std::next(numbers.begin(), 2);
    // Translate iterator-style position to size_type-style position
    std::vector<int>::size_type pos = std::distance(numbers.begin(), it);
    std::cout << "Position: " << pos << std::endl;
    return 0;
}

Выход:

Position: 2

Заключение

, std::advanceи std::nextвы можете легко конвертировать между этими двумя представлениями. Эти методы полезны, когда вам нужно выполнить вычисления или сравнения на основе положения элементов внутри контейнера.

Не забудьте указать <iterator>