TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #5836 3.08K
✅ How to: Создание собственного итератора для контейнера

Периодически требуется реализовать интеграцию с STL алгоритмами. Для этого необходимо реализовать правильные API.

Проблема: Нужно создать контейнер, работающий с range-based for и STL.


✏️ Решение:

1️⃣ Реализуйте iterator traits
2️⃣ Определите begin() и end()
3️⃣ Поддержите const итераторы

#include <iterator>
#include <algorithm>
#include <iostream>

template<typename T>
class CircularBuffer {
T* data;
size_t capacity_;
size_t size_;
size_t head_ = 0;

public:
explicit CircularBuffer(size_t capacity)
: data(new T[capacity]), capacity_(capacity), size_(0) {}

~CircularBuffer() { delete[] data; }

// Iterator class
class iterator {
T* ptr;
size_t capacity;
size_t index;

public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;

iterator(T* ptr, size_t capacity, size_t index)
: ptr(ptr), capacity(capacity), index(index) {}

reference operator*() { return ptr[index % capacity]; }
pointer operator->() { return &ptr[index % capacity]; }

iterator& operator++() {
++index;
return *this;
}

iterator operator++(int) {
iterator tmp = *this;
++index;
return tmp;
}

bool operator==(const iterator& other) const {
return index == other.index;
}

bool operator!=(const iterator& other) const {
return !(*this == other);
}
};

void push(const T& item) {
data[(head_ + size_) % capacity_] = item;
if (size_ < capacity_) {
++size_;
} else {
++head_;
head_ %= capacity_;
}
}

iterator begin() { return iterator(data, capacity_, head_); }
iterator end() { return iterator(data, capacity_, head_ + size_); }

size_t size() const { return size_; }
bool empty() const { return size_ == 0; }
};

int main() {
CircularBuffer<int> buffer(5);

// Заполняем буфер
for (int i = 1; i <= 7; ++i) {
buffer.push(i);
}

// Range-based for работает!
for (const auto& item : buffer) {
std::cout << item << " ";
}
std::cout << std::endl;

// STL алгоритмы работают!
auto it = std::find(buffer.begin(), buffer.end(), 5);
if (it != buffer.end()) {
std::cout << "Found: " << *it << std::endl;
}
}


Частые ошибки: Не реализовать все необходимые operator для итератора.

💡 Совет: Правильные итераторы делают ваш контейнер first-class citizen в ST.

Библиотека C/C++ разработчика #буст
  • ❤ 3
  • 👍 3
More from @cppproglib
  1. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  2. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 13, 2026🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение s…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →