在C++中实现可迭代自定义容器需提供begin()和end()方法及符合指针行为的迭代器类,通过重载*、->、++、!=等操作符,使容器支持范围for循环和标准算法;示例MyVector容器结合普通迭代器与const迭代器,实现动态数组的STL风格遍历。

在C++中实现一个可迭代的自定义容器,关键在于提供迭代器支持和符合STL风格的接口。只要容器有begin()和end()方法,并且迭代器能正确遍历内部数据,就能用于范围for循环和标准算法。
定义容器基本结构
先设计一个简单的动态数组容器,比如MyVector:
templateclass MyVector { private: T* data; size_t size; size_t capacity; public: // 构造、析构等 MyVector() : size(0), capacity(10) { data = new T[capacity]; }
~MyVector() { delete[] data; } void push_back(const T& value) { if (size >= capacity) { // 简单扩容 capacity *= 2; T* new_data = new T[capacity]; for (size_t i = 0; i zuojiankuohaophpcn size; ++i) new_data[i] = data[i]; delete[] data; data = new_data; } data[size++] = value; } size_t getSize() const { return size; }};
实现迭代器类
迭代器本质是一个类,模拟指针行为。需要重载*、->、++、!=等操作符:
立即学习“C++免费学习笔记(深入)”;
templateclass MyVector { // ... 上面的成员 public: // 嵌套迭代器类 class iterator { private: T ptr; public: iterator(T p) : ptr(p) {}
T& operator*() { return *ptr; } T* operator-youjiankuohaophpcn() { return ptr; } iterator& operator++() { ++ptr; return *this; } // 前缀++ iterator operator++(int) { // 后缀++ iterator tmp = *this; ++ptr; return tmp; } bool operator!=(const iterator& other) const { return ptr != other.ptr; } bool operator==(const iterator& other) const { return ptr == other.ptr; } }; // begin 和 end 方法 iterator begin() { return iterator(data); } iterator end() { return iterator(data + size); }};
支持 const 迭代器(可选但推荐)
为了能在const对象上迭代,添加const_iterator:
class const_iterator {
private:
const T* ptr;
public:
const_iterator(const T* p) : ptr(p) {}
const T& operator*() const { return *ptr; }
const T* operator->() const { return ptr; }
const_iterator& operator++() { ++ptr; return *this; }
const_iterator operator++(int) {
const_iterator tmp = *this;
++ptr;
return tmp;
}
bool operator!=(const const_iterator& other) const {
return ptr != other.ptr;
}
bool operator==(const const_iterator& other) const {
return ptr == other.ptr;
}
};
// 对应的 begin/end
const_iterator begin() const { return const_iterator(data); }
const_iterator end() const { return const_iterator(data + size); }
测试使用
现在可以像STL容器一样使用:
#includeint main() { MyVector vec; vec.push_back(10); vec.push_back(20); vec.push_back(30); // 范围for循环 for (int x : vec) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn x zuojiankuohaophpcnzuojiankuohaophpcn " "; } std::cout zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // 标准算法 auto it = std::find(vec.begin(), vec.end(), 20); if (it != vec.end()) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Found: " zuojiankuohaophpcnzuojiankuohaophpcn *it zuojiankuohaophpcnzuojiankuohaophpcn "\n"; }}
基本上就这些。核心是让begin()返回指向首元素的迭代器,end()返回指向末尾后一位的迭代器,迭代器类正确实现指针语义。这样你的自定义容器就能无缝集成到C++标准库生态中。











