【问题标题】:How to use the penultimate position of an iterator in c++如何在c ++中使用迭代器的倒数第二个位置
【发布时间】:2011-12-18 05:44:45
【问题描述】:

我有以下代码可以帮助我将一堆值写入逗号分隔的文件格式。我的问题是,我不想在写入normcsv 的最后一个元素之后使用逗号。如何在这种 If 子句中使用 beg

if(beg == penultimate element)
then.... bla bla...

我尝试的所有方法都以迭代器无效

告终
ReadLine.erase(0,17);
int offsets[] = {8,8,8,8,8,8};
boost::offset_separator f(offsets, offsets+6);
boost::tokenizer<boost::offset_separator> RVBEARline(ReadLine,f);
boost::tokenizer<boost::offset_separator>::iterator beg;

for( beg=RVBEARline.begin(); beg!=RVBEARline.end();++beg )
{                                   
    copy=*beg;
    boost::trim(copy);
    if(copy.compare(0,1,".")==0)
    {
        copy.insert(0,"0");
    }

    normcsv << copy <<",";
}

【问题讨论】:

    标签: c++ boost iterator


    【解决方案1】:

    难道你不能总是删除最后一个字符,因为你知道这将是一个无关的逗号吗?

    【讨论】:

    • 好吧,在我的 sn-p 的倒数第二行中,我将“copy”发送到 outfile,后跟一个逗号(我必须插入 io 以获得 csv 格式)。这很好,除了最后一个“副本”被发送到文件之外,其他所有人都需要。
    【解决方案2】:

    除了在 last 迭代期间之外,在元素 之后 打印逗号,而不是在元素 之前 除了在 first 期间打印它 迭代。为此,您可以使用if(beg != RVBEARline.begin())

    【讨论】:

    • +1,除了我会避免在每次循环迭代时同时调用.begin() 和调用.end()(在条件下)。
    • @Lumpi :使用简单的bool 变量跟踪您的状态,而不是重复比较.begin()
    【解决方案3】:

    作为 ruakh 的“first plus rest”方法的替代方案,您可以通过使用循环半结构来减少一个局部变量:

    {
      auto it = x.begin(), end = x.end();
    
      if (it != end)
      {
        for ( ; ; )
        {
          process(*it);
    
          if (++it == end) break;
    
          print_delimiter();
        }
      }
    }
    

    这里x.begin()x.end() 只被调用一次。每轮循环有一个强制比较,这是可能的最小值。空的检查挂在外面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多