【问题标题】:issue with boost::tokenizer_iterator -- how to peek next iterator?boost::tokenizer_iterator 的问题——如何查看下一个迭代器?
【发布时间】:2012-11-09 17:29:09
【问题描述】:

代码是这样的

 void buildIt(Object& o, Tokenizer::const_iterator begin, Tokenizer::const_iterator end){
   if(begin == end) return;
   else{
    string parent = *begin;
    bool hasChild = (begin+1) != end; //error: class booost::token_iterator<...> has no member named 'advance'
   }
 }

如何在不移动的情况下检查下一个迭代器是否有效?

【问题讨论】:

  • 你的问题是begin+1。此操作仅在 RandomAccessIterators 上受支持。一般来说,尽量避免使用它。使用boost::next/boost::prevstd::advance。取决于您是否要更改迭代器的状态。
  • 我认为在这种情况下它会根据迭代器类型使用它的 std::advance 版本?
  • 不,advance 将根据迭代器类型使用正确的方法,而不是 operator+
  • 好酷,只是因为我期待 operator+ 调用 Advance 或类似的东西而感到困惑。那和错误消息说它在使用运算符时找不到提前+

标签: c++ boost iterator


【解决方案1】:

您总是可以只复制迭代器并增加副本。或使用boost::next

if(boost::next(iter) == end)
  cout << "...";

【讨论】:

  • 我想这样会好一些。也许较新的 boost 版本解决了这个问题
  • 我想这不是问题,而是我对界面的更多误解
【解决方案2】:
for (Tokenizer::const_iterator i = begin; i!= end; ++i) {
    ...
}

【讨论】:

  • 没有for循环就没有办法了吗?我只需要在开始后检查元素,而不需要创建函数或 for 循环,必须有更清洁的方法吗?
  • 附上代码的描述不仅对问题的原作者有帮助。
  • @Boeckm 我的错,呵呵,我认为 for 循环本身已经足够清晰了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2019-08-09
  • 2011-08-21
  • 2014-01-22
  • 2023-03-22
相关资源
最近更新 更多