包装STL vector并改变其迭代器的行为
Wrap STL vector and change behavior of its iterator
有这样的代码:
#include <iostream>
#include <vector>
template <class T>
class A{
public:
class iterator : public std::vector<T>::iterator{
public:
T& operator*(){
??
}
};
iterator begin(){
return v.begin(); // error
}
iterator end(){
return v.end(); // error
}
void add(const T& elem){
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for(A<int>::iterator it = a.begin(); it != a.end(); ++it){
std::cout << *it << std::endl;
}
return 0;
}
这是std::vector
的包装器,带有我自己的附加函数。我想使用std::vector
的迭代器,但是我只想改变operator*
的迭代器行为:
T& operator*(){
// do some additional function
// normal behavior, return value of some element in vector
??
}
我如何使用std::vector
和它的迭代器只修改operator*
?我还想包装函数像begin()
和end()
迭代器,如何正确包装它们?
使用这个主题的答案中的技巧,我设法用以下方法解决了我的问题:
#include <iostream>
#include <vector>
template <class T>
class A {
public:
class iterator : public std::vector<T>::iterator {
public:
iterator(typename std::vector<T>::iterator c) : std::vector<T>::iterator(c) {
}
T& operator*() {
std::cout << "Im overloaded operator*n";
return std::vector<T>::iterator::operator *();
}
};
iterator begin() {
return iterator(v.begin());
}
iterator end() {
return iterator(v.end());
}
void add(const T& elem) {
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for (A<int>::iterator it = a.begin(); it != a.end() ; ++it) {
std::cout << *it << std::endl;
}
return 0;
}
也许对别人有帮助。
包装stdlib迭代器最好使用迭代器适配器。这项任务远非微不足道,而且还有Boost。简化任务的迭代器库。也许所提供的迭代器之一已经解决了您的问题。
如果你打算自己写这个(我真的不推荐这样做),你应该实现你自己的迭代器,并让它可以从vector::iterator
构造,然后重载所有必需的操作符,以满足你的新迭代器模型的概念要求。也从std::iterator
继承,以获得性状工作。不要忘记使用一个const变体。本书有一章专门介绍开发自己的迭代器。还要获得标准的副本(c++ 03或c++ 11,在这里无关紧要)。你会需要它的
不幸的是,要做到这一点,唯一的方法是为std::vector
及其迭代器类型编写一个完整的包装器。
一个不继承自std::vector<T>::iterator
,因为它不需要是一个类。在某些实现中,这只是T*
的类型定义,不能从指针继承。也不应该继承标准容器,因为它们缺乏虚析构函数;一种可能是以private
或protected
的方式继承,并通过typedef
和using
使所有的符号和函数可见。最后,您必须重写整个vector及其转发对基实现的调用的迭代器。
我认为这里的答案很可能是不应该改变迭代器的操作符*的行为。操作符重载应该只在非常直观的情况下进行,任何阅读使用操作符的代码的人都会自动知道发生了什么。这方面的一个例子是,如果您有一个矩阵类和重载操作符+。当有人看到你把两个矩阵对象加在一起时,他们很容易知道发生了什么。
但是,当解引用迭代器时,没有直观的感觉会对类产生什么额外的副作用。
- 使用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++问题
- std::list 的 end() 迭代器位置在擦除时会改变吗?
- 如果vector改变,迭代器是否指向相同的元素?或者怎么做
- 包装STL vector并改变其迭代器的行为
- 如何实现std::advance来改变迭代器类型上的行为
- 当我改变矢量时迭代器发生了什么