推荐比mini-stl更好的C++实现项目代码

 代码来源 -- STL模拟: STL模拟 的各类实现 - Gitee.com

// 防止头文件被重复包含
#pragma once
// 包含输入输出流库,用于基本的输入输出操作
#include <iostream>
// 包含向量容器库,向量是一种动态数组
#include <vector>
// 包含列表容器库,列表是一种双向链表
#include <list>

// 使用标准命名空间,这样就可以直接使用标准库中的类和函数,而无需加上std::前缀
using namespace std;

// 正向迭代器类模板,用于以正向顺序遍历容器
template <class Iterator>
class ForwardIterator {
private:
    // 当前迭代器指向的位置
    Iterator current;

public:
    // 定义迭代器所指向元素的类型
    using value_type = typename iterator_traits<Iterator>::value_type;
    // 定义迭代器所指向元素的引用类型
    using reference = typename iterator_traits<Iterator>::reference;
    // 定义迭代器所指向元素的指针类型
    using pointer = typename iterator_traits<Iterator>::pointer;

    // 构造函数,使用一个迭代器初始化当前迭代器
    explicit ForwardIterator(Iterator it) : current(it) {}

    // 解引用操作符,返回当前迭代器指向的元素的引用
    reference operator*() {
        return *current;
    }

    // 前置递增操作符,将迭代器移动到下一个位置,并返回自身引用
    ForwardIterator& operator++() {
        ++current;
        return *this;
    }

    // 后置递增操作符,先保存当前迭代器状态,再将迭代器移动到下一个位置,最后返回保存的状态
    ForwardIterator operator++(int) {
        ForwardIterator tmp = *this;
        ++(*this);
        return tmp;
    }

    // 不等于比较操作符,用于判断两个迭代器是否指向不同的位置
    bool operator!=(const ForwardIterator& other) const {
        return current != other.current;
    }
};

// 常量正向迭代器类模板,用于以正向顺序遍历容器,且不允许修改元素
template <class Iterator>
class ConstForwardIterator {
private:
    // 当前迭代器指向的位置
    Iterator current;

public:
    // 定义迭代器所指向元素的类型
    using value_type = typename iterator_traits<Iterator>::value_type;
    // 定义迭代器所指向元素的常量引用类型
    using reference = const typename iterator_traits<Iterator>::value_type&;
    // 定义迭代器所指向元素的常量指针类型
    using pointer = const typename iterator_traits<Iterator>::value_type*;

    // 构造函数,使用一个迭代器初始化当前迭代器
    explicit ConstForwardIterator(Iterator it) : current(it) {}

    // 解引用操作符,返回当前迭代器指向的元素的常量引用
    reference operator*() const {
        return *current;
    }

    // 前置递增操作符,将迭代器移动到下一个位置,并返回自身引用
    ConstForwardIterator& operator++() {
        ++current;
        return *this;
    }

    // 后置递增操作符,先保存当前迭代器状态,再将迭代器移动到下一个位置,最后返回保存的状态
    ConstForwardIterator operator++(int) {
        ConstForwardIterator tmp = *this;
        ++(*this);
        return tmp;
    }

    // 不等于比较操作符,用于判断两个迭代器是否指向不同的位置
    bool operator!=(const ConstForwardIterator& other) const {
        return current != other.current;
    }
};

// 反向迭代器类模板,用于以反向顺序遍历容器
template <class Iterator>
class ReverseIterator {
private:
    // 当前迭代器指向的位置
    Iterator current;

public:
    // 定义迭代器所指向元素的类型
    using value_type = typename iterator_traits<Iterator>::value_type;
    // 定义迭代器所指向元素的引用类型
    using reference = typename iterator_traits<Iterator>::reference;

    // 构造函数,从标准库的反向迭代器构造当前反向迭代器
    explicit ReverseIterator(const std::reverse_iterator<Iterator>& rev_it)
        : current(rev_it.base()) {}

    // 解引用操作符,返回当前迭代器指向的元素
    auto operator*() const {
        Iterator tmp = current;
        --tmp;  // 反向迭代,因为反向迭代器的行为与正向迭代器相反
        return *tmp;
    }

    // 前置递增操作符,将迭代器移动到前一个位置(反向移动),并返回自身引用
    ReverseIterator& operator++() {
        --current;
        return *this;
    }

    // 后置递增操作符,先保存当前迭代器状态,再将迭代器移动到前一个位置(反向移动),最后返回保存的状态
    ReverseIterator operator++(int) {
        ReverseIterator tmp = *this;
        --current;
        return tmp;
    }

    // 不等于比较操作符,用于判断两个迭代器是否指向不同的位置
    bool operator!=(const ReverseIterator& other) const {
        return current != other.current;
    }

    // 返回底层的正向迭代器
    Iterator base() const {
        return current;
    }
};

// 常量反向迭代器类模板,用于以反向顺序遍历容器,且不允许修改元素
template <class Iterator>
class ConstReverseIterator {
private:
    // 当前迭代器指向的位置
    Iterator current;

public:
    // 定义迭代器所指向元素的类型
    using value_type = typename iterator_traits<Iterator>::value_type;
    // 定义迭代器所指向元素的常量引用类型
    using reference = const typename iterator_traits<Iterator>::value_type&;

    // 构造函数,从标准库的常量反向迭代器构造当前常量反向迭代器
    explicit ConstReverseIterator(const std::reverse_iterator<Iterator>& rev_it)
        : current(rev_it.base()) {}

    // 解引用操作符,返回当前迭代器指向的元素的常量引用
    auto operator*() const {
        Iterator tmp = current;
        --tmp;  // 反向迭代,因为反向迭代器的行为与正向迭代器相反
        return *tmp;
    }

    // 前置递增操作符,将迭代器移动到前一个位置(反向移动),并返回自身引用
    ConstReverseIterator& operator++() {
        --current;
        return *this;
    }

    // 不等于比较操作符,用于判断两个迭代器是否指向不同的位置
    bool operator!=(const ConstReverseIterator& other) const {
        return current != other.current;
    }

    // 返回底层的正向迭代器
    Iterator base() const {
        return current;
    }
};

// 容器适配器类模板,用于为容器提供自定义的迭代器接口
template <class Container>
class ContainerAdapter {
private:
    // 引用要适配的容器
    Container& container;

public:
    // 定义容器的迭代器类型
    using iterator = typename Container::iterator;
    // 定义容器的常量迭代器类型
    using const_iterator = typename Container::const_iterator;

    // 构造函数,初始化要适配的容器
    ContainerAdapter(Container& container) : container(container) {}

    // 返回正向迭代器的起始位置
    ForwardIterator<iterator> begin() {
        return ForwardIterator<iterator>(container.begin());
    }
    // 返回正向迭代器的结束位置
    ForwardIterator<iterator> end() {
        return ForwardIterator<iterator>(container.end());
    }

    // 返回正向常量迭代器的起始位置
    ConstForwardIterator<const_iterator> cbegin() const {
        return ConstForwardIterator<const_iterator>(container.cbegin());
    }
    // 返回正向常量迭代器的结束位置
    ConstForwardIterator<const_iterator> cend() const {
        return ConstForwardIterator<const_iterator>(container.cend());
    }

    // 返回反向迭代器的起始位置
    ReverseIterator<typename Container::iterator> rbegin() {
        return ReverseIterator<typename Container::iterator>(container.rbegin());
    }
    // 返回反向迭代器的结束位置
    ReverseIterator<typename Container::iterator> rend() {
        return ReverseIterator<typename Container::iterator>(container.rend());
    }
    // 返回常量反向迭代器的起始位置
    ConstReverseIterator<typename Container::const_iterator> crbegin() const {
        return ConstReverseIterator<typename Container::const_iterator>(container.crbegin());
    }
    // 返回常量反向迭代器的结束位置
    ConstReverseIterator<typename Container::const_iterator> crend() const {
        return ConstReverseIterator<typename Container::const_iterator>(container.crend());
    }
};
#include<iostream>
//以vector和list为例
#include<vector>
// 需要使用for_eacj必须引入的算法库函数
#include<algorithm>
#include"Iterator_for_all_container.h"

using namespace std;
//
//class OPerator
//{
//public:
//	OPerator();
//	~OPerator();
//	OPerator operator++();
//	OPerator operator++(int k);
//private:
//	int n;
//};
//
//OPerator::OPerator()
//{
//}
//
//OPerator::~OPerator()
//{
//}
//
//OPerator OPerator::operator++() {
//	// 前置++
//	++n;
//	return *this;
//}
//OPerator OPerator::operator++(int k) {
//	// 后置++
//	OPerator temp(*this);// 记录修改前的对象
//	n++;
//	return temp;
//}
//
//
//
 遍历
//void Test() {
//	vector<int> v;
//	v.push_back(20);
//	v.push_back(10);
//	v.push_back(5);
//
//	// 1.基本的循环
//	for (auto it = v.begin(); it !=  v.end(); ++it) {
//		cout << *it << " ";
//	}
//	cout << endl;
//	// 2.C++11之后,增强版for
//	for (const auto& elem : v) {
//		cout << elem << " ";
//	}
//	cout << endl;
//	// 3.lambda表达式
//	for_each(v.begin(), v.end(), [](int elem) { cout << elem << " "; });
//	cout << endl;
//	// 4.不需要修改容器元素的话,可以使用常量迭代器
//	for (auto it = v.cbegin(); it != v.cend(); ++it) {
//		cout << *it << " ";
//	}
//	cout << endl;
//}
//
//void Test_reverse() {
//	vector<int> vec;
//	for (int i = 0; i < 5; i++) {
//		vec.push_back(i);
//	}
//	// 反向迭代器
//	for (vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) {
//		cout << *it << " ";
//	}
//	cout << endl;
//	//lambda
//	for_each(vec.rbegin(), vec.rend(), [](const auto& elem)-> void { cout << elem << " "; });
//}


// 使用适配器类进行容器的遍历
template <class Container>
void testContainerAdapter(Container& container) {
    // 创建适配器实例
    ContainerAdapter<Container> adapter(container);

    // 正向迭代器测试
    std::cout << "正向迭代器: ";
    for (auto it = adapter.begin(); it != adapter.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 正向常量迭代器测试
    std::cout << "正向常量迭代器: ";
    for (auto it = adapter.cbegin(); it != adapter.cend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 反向迭代器测试
    std::cout << "反向迭代器: ";
    for (auto it = adapter.rbegin(); it != adapter.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 常量反向迭代器测试
    std::cout << "常量反向迭代器: ";
    for (auto it = adapter.crbegin(); it != adapter.crend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    // lambda
    for_each(adapter.crbegin(), adapter.crend(), [](const auto& elem) ->void { std::cout << elem << " "; });
}

void Test_iterator() {
    // 测试 vector
    std::vector<int> vec = { 1, 2, 3, 4, 5 };
    std::cout << "测试 vector 容器:" << std::endl;
    testContainerAdapter(vec);

    // 测试 list
    std::list<int> lst = { 10, 20, 30, 40, 50 };
    std::cout << "\n测试 list 容器:" << std::endl;
    testContainerAdapter(lst);
}

int main() {
    Test_iterator();
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

potato_potato_123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值