是否可以在C ++中为矢量(或其他类似数据类型)编写用户迭代类?

rsk82

普通的标准迭代方法是这样的:

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    /* std::cout << *it; ... */
}

它涉及太多的键入和重复向量变量名称。

有没有一种方法可以简化它,例如

for (auto item : vector_var) { /*...*/ }

循环,但也可以访问索引和其他功能。

我想到这个:

for (auto item : myIterationClass(vector_var)) {
   item->index;
   item->value;
   item->delete();
   item->replaceWith(42);
}

它并不一定要很快,但要依靠我需要编写的代码。

迪特玛·库尔(DietmarKühl)

假设您接受循环稍有变化,那肯定是可行的:

for (auto item : myIterationClass(vector_var)) {
    item.index();
    item.value();
    item.erase();
    item.replaceWith(42);
}

这个想法是要有myIterationClass()一个薄包装器,它会返回带有相当自定义值的迭代器。但是,使用erase()有点问题,因为您不应该在迭代容器时更改容器,即,如果确实需要这些容器,则必须记录要擦除的元素并在以后进行处理。

尽管这不是一个好主意,但下面是实现index()的快速演示value()实现replaceWith()将是微不足道的,而实现任何改变序列长度的操作可能会很有趣。假定迭代器控制序列,则可以直接更改基础序列并适当调整保留的索引来完成。请注意,还有多种表示迭代器的方法。我随机选择使用指向容器的指针和索引的组合。如果序列不添加或删除元素,也可以使用两个迭代器并计算索引作为两者之间的差值来完成。

#include <algorithm>
#include <iostream>
#include <vector>

template <typename T>
class wrapped_iterator
{
    T*                    container;
    typename T::size_type position;
public:
    wrapped_iterator(T* container, typename T::size_type position)
        : container(container)
        , position(position) {
    }
    wrapped_iterator<T>& operator*() { return *this; }
    wrapped_iterator<T>& operator++() { ++position; return *this; }
    wrapped_iterator<T>  operator++(int) {
        wrapped_iterator<T> rc(*this);
        ++*this;
        return rc;
    }
    bool operator== (wrapped_iterator<T> const& other) const {
        return position == other.position;
    }
    bool operator!= (wrapped_iterator<T> const& other) const {
        return !(*this == other);
    }
    typename T::size_type        index() const { return position; }
    typename T::const_reference& value() const { return (*container)[position]; }
};

template <typename T>
class wrapped
{
    T* container;
public:
    typedef wrapped_iterator<T> iterator;
    wrapped(T& container): container(&container) {}
    iterator begin() const { return iterator(container, 0u); }
    iterator end() const { return iterator(container, container->size()); }
};

template <typename T>
wrapped<T> wrapper(T& container) {
    return wrapped<T>(container);
}

int main()
{
    std::vector<int> v{ 7, 6, 5, 4, 3, 2, 1 };
    for (auto item : wrapper(v)) {
        std::cout << "index=" << item.index() << ' '
                  << "value=" << item.value() << '\n';
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以迭代目标c中的被屏蔽的枚举

来自分类Dev

是否可以在C ++中为矢量(或其他类似数据类型)编写用户迭代类?

来自分类Dev

是否可以在c ++中创建类型的向量?

来自分类Dev

emacs是否可以在C ++枚举中对齐'='

来自分类Dev

处理器中C中的int,short和其他数据类型的范围?

来自分类Dev

C#中是否可以替代Constant?

来自分类Dev

是否可以在C中创建长度为一位的数据类型

来自分类Dev

是否可以在C,C ++中使用类似Java的同步语句?

来自分类Dev

C指针可以与任何其他数据类型对齐吗?

来自分类Dev

C ++是否可以编写以Container为参数的模板?

来自分类Dev

在C ++中,如何编写函数使其可以在任何数据类型上工作?

来自分类Dev

是否可以在C中编写自己的kbhit()?

来自分类Dev

C中的同义`typedef`是否可以互换?

来自分类Dev

在C ++中,是否可以强迫用户捕获异常?

来自分类Dev

是否有必要照顾到为Windows和Linux编写的程序中的长数据类型?

来自分类Dev

是否可以用C ++而不是C编写OpenCL内核?

来自分类Dev

是否可以在C中编写一致的malloc实现?

来自分类Dev

是否可以在Objective-C中使用Metal数据类型?

来自分类Dev

是否可以使用CRTP在c ++中访问子类型?

来自分类Dev

在C ++中是否可以有虚拟类型?

来自分类Dev

C ++-是否可以在ifstream中编辑数据?

来自分类Dev

是否可以等待C#中的线程

来自分类Dev

是否可以在C#中覆盖赋值“ =”

来自分类Dev

是否可以在目标c中迭代被屏蔽的枚举

来自分类Dev

C#App是否可以访问其他类的变量?

来自分类Dev

是否可以在C,C ++中使用类似Java的同步语句?

来自分类Dev

是否可以检查C#中的值是否为int?

来自分类Dev

是否可以在salesforce中编写C#代码?

来自分类Dev

是否可以在其他文件中的其他类主体内创建类而不是 C# 中的声明?

Related 相关文章

  1. 1

    是否可以迭代目标c中的被屏蔽的枚举

  2. 2

    是否可以在C ++中为矢量(或其他类似数据类型)编写用户迭代类?

  3. 3

    是否可以在c ++中创建类型的向量?

  4. 4

    emacs是否可以在C ++枚举中对齐'='

  5. 5

    处理器中C中的int,short和其他数据类型的范围?

  6. 6

    C#中是否可以替代Constant?

  7. 7

    是否可以在C中创建长度为一位的数据类型

  8. 8

    是否可以在C,C ++中使用类似Java的同步语句?

  9. 9

    C指针可以与任何其他数据类型对齐吗?

  10. 10

    C ++是否可以编写以Container为参数的模板?

  11. 11

    在C ++中,如何编写函数使其可以在任何数据类型上工作?

  12. 12

    是否可以在C中编写自己的kbhit()?

  13. 13

    C中的同义`typedef`是否可以互换?

  14. 14

    在C ++中,是否可以强迫用户捕获异常?

  15. 15

    是否有必要照顾到为Windows和Linux编写的程序中的长数据类型?

  16. 16

    是否可以用C ++而不是C编写OpenCL内核?

  17. 17

    是否可以在C中编写一致的malloc实现?

  18. 18

    是否可以在Objective-C中使用Metal数据类型?

  19. 19

    是否可以使用CRTP在c ++中访问子类型?

  20. 20

    在C ++中是否可以有虚拟类型?

  21. 21

    C ++-是否可以在ifstream中编辑数据?

  22. 22

    是否可以等待C#中的线程

  23. 23

    是否可以在C#中覆盖赋值“ =”

  24. 24

    是否可以在目标c中迭代被屏蔽的枚举

  25. 25

    C#App是否可以访问其他类的变量?

  26. 26

    是否可以在C,C ++中使用类似Java的同步语句?

  27. 27

    是否可以检查C#中的值是否为int?

  28. 28

    是否可以在salesforce中编写C#代码?

  29. 29

    是否可以在其他文件中的其他类主体内创建类而不是 C# 中的声明?

热门标签

归档