在自定义迭代器中包装STL容器的最佳方法是什么?
What is the best approach for wrapping an STL container in a custom iterator?
为了说明,假设我有一个自定义容器,它在内部使用STL std::vector
。如果我将std::vector<char*>::iterator
类型定义为my_container::iterator
,那么对迭代器进行解引用将返回char*
。然而,我的自定义容器应该隐藏它的内部,这意味着我想要一个解引用来返回一个char
。
如何做到这一点?
class my_container {
public:
typedef std::vector<char*> vector;
private:
vector vec_;
};
UPDATE: char*
为例。它不是指C字符串;如果使用int
,这个例子会更清楚。
另外,我想使用std::forward_iterator_tag
和std::iterator
,因为这似乎是一个更标准/当前的方法。
如果您想要自己的迭代器,只需开始将其作为嵌套类编写。它需要包装一个std::vector<char*>::iterator
,拦截通常的操作(例如++
, *
, --
),类似于:
class iterator
{
public:
iterator& operator++() { ++i_; return *this; }
char& operator*() { return **i_; }
...etc...
private:
std::vector<char*>::iterator i_;
};
的 ?唷!,很难回答的问题。
一种 方法是使用非常有用的框架,这个框架是由boost.org上的好家伙创建的:
http://www.boost.org/doc/libs/1_58_0/libs/iterator/doc/使用boost::indirect_iterator
编辑(未测试):
struct S
{
using iterator =
boost::indirect_iterator<std::vector<char*>::iterator>;
using const_iterator =
boost::indirect_iterator<std::vector<char*>::const_iterator>;
iterator begin() { return iterator(vec_.begin()); }
iterator end() { return iterator(vec_.begin()); }
const_iterator begin() const { return const_iterator(vec_.begin()); }
const_iterator end() const { return const_iterator(vec_.begin()); }
private:
std::vector<char*> vec_;
};
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?