C++ 同一容器的多个自定义迭代器

C++ 同一容器的多个自定义迭代器,c++,c++17,C++,C++17,我创建了一个动态容器,用于将字节存储为uint8\t,并在容器类中实现了一个迭代器类。迭代器按预期遍历字节。但是这些字节是用头格式化的,所以我想实现另一个迭代器,根据字节头跳过字节数组。当与(auto&x:container)for一起使用时,是否可以根据首先声明的类运行这两个迭代器类?还是有其他方法可以做到这一点 当前迭代器和容器 类容器{ 公众: container():s(0),c(2),data(newuint8_t[2]){}; 容器(大小保留):s(0),c(保留+1),数据(新ui

我创建了一个动态容器,用于将字节存储为
uint8\t
,并在容器类中实现了一个迭代器类。迭代器按预期遍历字节。但是这些字节是用头格式化的,所以我想实现另一个迭代器,根据字节头跳过字节数组。当与(auto&x:container)for一起使用时,是否可以根据首先声明的类运行这两个迭代器类?还是有其他方法可以做到这一点

当前迭代器和容器
类容器{
公众:
container():s(0),c(2),data(newuint8_t[2]){};
容器(大小保留):s(0),c(保留+1),数据(新uint8[reserve+1]){};
~container();
//容器插入、操作员等。。。
//迭代器类
类迭代器{
公众:
uint8_t*ptr;
使用迭代器\u category=std::forward\u迭代器\u标记;
使用差分类型=std::ptrdiff\t;
使用值\u type=uint8\u t;
使用指针=uint8_t*;
使用reference=uint8_t&;

迭代器(指针m_ptr):ptr(m_ptr){std::cout否,范围迭代语法就是这样的:一个代理,用于调用容器的
begin()
end()
;然后对返回的序列进行迭代。这是它唯一的工作方式

C++20添加了范围库,可用于将两个独立的迭代器序列组合在一起。在C++20之前,这种情况下最常见的选择是声明第三个迭代器类,代理两个基础迭代器类的组合序列,然后将此代理迭代器类与
begin()一起使用
end()
。基本方法非常简单:

  • begin()
    返回第三个迭代器类,该迭代器类使用代理的、内部的开始迭代器值和结束迭代器值的两个基础迭代器类的结束迭代器值初始化(即,两个迭代器值的开始=结束)

  • *
    和/或
    ->
    运算符重载检查第一个迭代器类的代理开始迭代器值是否已达到其结束值。如果未达到,则使用它实现
    *
    ->
    ,否则使用第二个代理开始迭代器值

  • 各种前向/增量重载使第一个迭代器类的代理起始迭代器值提前。如果它已经处于其迭代器类的终止迭代器值,则第二个迭代器类的代理起始迭代器值将提前


  • 不,范围迭代语法就是这样的:一个代理,用于调用容器的
    begin()
    end()
    ;然后迭代返回的序列。这是它唯一的工作方式

    C++20添加了范围库,可用于将两个独立的迭代器序列组合在一起。在C++20之前,这种情况下最常见的选择是声明第三个迭代器类,代理两个基础迭代器类的组合序列,然后将此代理迭代器类与
    begin()一起使用
    end()
    。基本方法非常简单:

  • begin()
    返回第三个迭代器类,该迭代器类使用代理的、内部的开始迭代器值和结束迭代器值的两个基础迭代器类的结束迭代器值初始化(即,两个迭代器值的开始=结束)

  • *
    和/或
    ->
    运算符重载检查第一个迭代器类的代理开始迭代器值是否已达到其结束值。如果未达到,则使用它实现
    *
    ->
    ,否则使用第二个代理开始迭代器值

  • 各种前向/增量重载使第一个迭代器类的代理起始迭代器值提前。如果它已经处于其迭代器类的终止迭代器值,则第二个迭代器类的代理起始迭代器值将提前


  • 您不能让迭代根据声明顺序表现出不同的行为。这意味着什么?不知何故,这就像要求同一个类根据上下文或者随机地表现出不同的行为

    但是,您可以实现如下代码:

    for (auto x: my_container.raw()) { ... }
    for (auto x: my_container.rows()) { ... }
    for (auto x: my_container.columns()) { ... }
    for (auto x: my_container.pixels()) { ... }
    
    注意:我只是猜测您提到的头是一个位图头,并且您正在处理一个图像文件

    :你的代码有一大堆错误,不是灾难性的,但仍然有很好的改进机会,比如使用RAW <代码> NeX[]/COD>内存分配,应该是<代码> STD::向量< /代码>。考虑发布你的工作(?)代码。
    codereview.stackexchange.com.

    您不能让迭代根据声明顺序表现得不同。这到底意味着什么?不知何故,这就像要求同一个类根据上下文或随机情况表现得不同

    但是,您可以实现如下代码:

    for (auto x: my_container.raw()) { ... }
    for (auto x: my_container.rows()) { ... }
    for (auto x: my_container.columns()) { ... }
    for (auto x: my_container.pixels()) { ... }
    
    注意:我只是猜测您提到的头是一个位图头,并且您正在处理一个图像文件

    :你的代码有一大堆错误,不是灾难性的,但仍然有很好的改进机会,比如使用RAW <代码> NeX[]/COD>内存分配,应该是<代码> STD::向量< /代码>。考虑发布你的工作(?)代码。
    codereview.stackexchange.com。

    我之所以使用new,是因为我不想使用
    std::vector
    使用的标准倍增等(或者有没有方法从
    std::vector
    扩展(继承)?什么