在自定义迭代器中包装STL容器的最佳方法是什么?

时间:2015-05-21 11:18:24

标签: c++ iterator containers template-meta-programming

为了说明,假设我有一个自定义容器,而不是内部使用STL std::vector。如果我将std::vector<char*>::iterator键入my_container::iterator,则取消引用迭代器将返回char*。但是,我的自定义容器应隐藏其内部,这意味着我想要取消引用以返回char

如何实现这一目标?

class my_container {
public:

    typedef std::vector<char*> vector;

private:

    vector vec_;

};

更新: char*就是一个例子。它不代表C字符串;使用int可以更清楚地了解示例。

另外,我想使用std::forward_iterator_tagstd::iterator,因为这似乎是一种更标准/最新的方法。

3 个答案:

答案 0 :(得分:5)

如果你想要自己的迭代器,只需将它作为嵌套类开始编写即可。它需要包装std::vector<char*>::iterator,拦截常规操作(例如++*--),例如:

class iterator
{
  public:
    iterator& operator++() { ++i_; return *this; }
    char& operator*() { return **i_; }
    ...etc...

  private:
    std::vector<char*>::iterator i_;
};

如果您尝试并卡住,请发布您的尝试,我们会进一步帮助您。

答案 1 :(得分:4)

最佳 方式? p !,强硬的问题。

一种 方式是使用boost.org上的好朋友为此目的而创建的非常有用的框架:

http://www.boost.org/doc/libs/1_58_0/libs/iterator/doc/

答案 2 :(得分:1)

使用boost::indirect_iterator

编辑:(未经测试)

SchedulerFactory sf = new StdSchedulerFactory()
Scheduler sched = sf.getScheduler()        
def name = "jobname"
Trigger trigger = sched.getTrigger(new TriggerKey("trigger_" + name))
def currentDate = new Date()
use (TimeCategory) {
    currentDate = currentDate + 300.seconds
}
trigger.nextFireTime = currentDate