gpt4 book ai didi

c++ - 创建 const 迭代器和非 const 迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:14 24 4
gpt4 key购买 nike

我正在为一个库编写一个迭代器类(比如 MyIterator)。

使用 const 重载来做是个好主意吗 const MyIterator就像一个const_iteratorstd::vector同时 MyIterator就像iteratorstd::vector

库用户/开发人员会感到困惑吗?

实现是这样的:

// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag

class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
mutable int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) {return p!=rhs.p;}
const int& operator*() const {return *p;} // <-- const overload
int& operator*() {return *p;}
};

另一种方法是使用模板来实现一个迭代器类,该迭代器类可以专门用于 const 和非 const 迭代器。我目前正在这样做(我听说 boost 正在这样做......)。但是,随着我实现范围,然后实现范围的范围(如在基于嵌套范围的 for 循环中),模板很快变得复杂。

最佳答案

使用 const MyIterator 代替 const_MyIterator (const_iterator) 是行不通的,因为 const_iterator 是不是常量迭代器,而是迭代常量元素的迭代器。

此外,对于 const MyIterator,您不能使用修改运算符,如 ++--,因为它们是非-const 方法,修改迭代器本身。

因此,如果您想提供某种类型的 const_iterator,您将无法绕过实现一个。

Will the library user/developer get confused?

最后,回答您的问题:是的,我认为是这样,因为 const iteratorconst_iterator 的行为(和期望)不同。

关于c++ - 创建 const 迭代器和非 const 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40428484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com