迭代器的平等
Iterator equality
本文关键字:迭代器 更新时间:2023-10-16
我正在创建一个实现双链表的容器类。
template <class T>
class dl_list {
public:
class link {
public:
T* data;
link *prev, *next;
};
class iterator {
link* node;
public:
link* get_node() { return node; }
// ++, --, * operators, etc.
};
// other stuff
};
很整洁,我玩得很开心。但我遇到的一个问题是,当我为迭代器类型定义相等操作符时,我必须进行模板特化。
template <class T>
bool operator==(typename dl_list<T>::iterator& lhv, typename dl_list<T>::iterator rhv) {
return lhv.get_node() == rhv.get_node();
}
不行,我必须这样专门化:
bool operator==(typename dl_list<int>::iterator& lhv, typename dl_list<int>::iterator rhv) {
return lhv.get_node() == rhv.get_node();
}
表示我想使用它的所有类型,这显然很烦人。我该怎么解决这个问题?
使其成为iterator
类的成员:
bool operator==( const interator& other ) const
{
return node == other.node;
}
你不能。编译器不能知道某个T
是另一个U
的嵌套类型。考虑
template<> class dl_list<float> {
public:
typedef dl_list<int>::iterator iterator;
};
必须直接将迭代器类型作为模板形参,或者将其定义为迭代器类的成员,或者在dl_list之外定义迭代器类,并在dl_list中为其定义一个typedef。
最简单的方法是在迭代器类中定义操作符:
class iterator
{
public:
...
friend bool operator==(iterator& lhs, iterator& rhs)
{
return lhs.get_node() == rhs.get_node();
}
};
(这里有点代码味道-我希望get_node()
有一个const
版本,允许operator==
接受const
引用的参数…)
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?