Как написать итератор, который будет возвращать отдельные цифры числа?

Как создать "бесконтейнерный" итератор, аналогичный std::ostream_iterator, для итерации по цифрам чисел в разных системах счисления, и при этом обеспечить правильную реализацию итератора конца?
  • 9 декабря 2023 г. 9:36
Ответы на вопрос 2
Для написания итератора, возвращающего отдельные цифры числа, можно создать класс, реализующий интерфейс итератора. Ниже приведен пример такого класса:

```cpp
#include <iostream>

class DigitIterator {
private:
    int number;
    int currentDigit;
    
public:
    DigitIterator(int num): number(num), currentDigit(0) {}
    
    bool operator!=(const DigitIterator& other) const {
        return currentDigit != other.currentDigit;
    }
    
    int operator*() const {
        return getNthDigit(number, currentDigit);
    }
    
    void operator++() {
        ++currentDigit;
    }
    
private:
    int getNthDigit(int num, int n) const {
        int power10 = 1;
        for (int i = 0; i < n; ++i) {
            power10 *= 10;
        }
        
        return (num / power10) % 10;
    }
};

int main() {
    int number = 12345;
    DigitIterator begin(number);
    DigitIterator end(number + 1);
    
    for (DigitIterator it = begin; it != end; ++it) {
        std::cout << *it << " ";
    }
    
    return 0;
}
```

В данном примере класс DigitIterator реализует итератор, который возвращает отдельные цифры числа. В функции main() создается итератор начала и конца диапазона цифр числа и затем используется цикл для итерации по цифрам и вывода их на экран.

Чтобы создать "бесконтейнерный" итератор для итерации по цифрам чисел в разных системах счисления, можно модифицировать класс DigitIterator для принятия радикса системы счисления в конструкторе и использования его для определения n-й цифры числа. В функции getNthDigit() необходимо заменить деление и взятие остатка на операции деления и взятия остатка от деления на радикс. Пример модифицированного класса:

```cpp
#include <iostream>

class DigitIterator {
private:
    int number;
    int currentDigit;
    int radix;
    
public:
    DigitIterator(int num, int r): number(num), currentDigit(0), radix(r) {}
    
    bool operator!=(const DigitIterator& other) const {
        return currentDigit != other.currentDigit;
    }
    
    int operator*() const {
        return getNthDigit(number, currentDigit);
    }
    
    void operator++() {
        ++currentDigit;
    }
    
private:
    int getNthDigit(int num, int n) const {
        int powerRadix = 1;
        for (int i = 0; i < n; ++i) {
            powerRadix *= radix;
        }
        
        return (num / powerRadix) % radix;
    }
};

int main() {
    int number = 12345;
    int radix = 16;
    
    DigitIterator begin(number, radix);
    DigitIterator end(number + 1, radix);
    
    for (DigitIterator it = begin; it != end; ++it) {
        std::cout << *it << " ";
    }
    
    return 0;
}
```

В данном примере создается итератор начала и конца диапазона цифр числа, принимающих значение от 0 до радикс-1. При итерации все цифры числа выводятся на экран.
Примерно так. Ссылка на Online GDB .
Похожие вопросы