使用forward迭代器反向迭代

时间:2014-06-24 06:44:44

标签: c++ iterator set

我有一个功能,我希望将一组中的每个元素与之前的元素进行比较。我想做这样的事情:

    std::set<int> sSet;
    std::set<int>::iterator it;
    std::set<int>::iterator itR;

    sSet.insert(1);
    sSet.insert(2);
    sSet.insert(3);
    sSet.insert(4);
    sSet.insert(5);
    sSet.insert(6);

    for (it=sSet.begin(); it!=sSet.end(); ++it)  //simple forward loop
    {
      itR = it;
      if(it != sSet.begin())  
        itR--;
      for(;itR!=sSet.begin();itR--)
      {
        //Reverse iteration
        //for comparing every element to all the previous elements
        //Problem here is it goes up to the second element only and not first 
        //because of the condition itR!=sSet.begin()
      } 
    }     

我在考虑在这里使用反向迭代器但是我再也找不到从特定位置(或前向迭代器)设置反向迭代器的方法。

有没有正确的方法呢?

更新:上面使用的设置仅用于演示。实际实现为一组类,定义如下:

    std::set<TBigClass, TBigClassComparer> sSet;
    class TBigClassComparer
    {
     public:
     bool operator()(const TBigClass s1, const TBigClass s2) const
     {
       //comparison logic goes here
     }
    };

2 个答案:

答案 0 :(得分:1)

想反向?!使用反向迭代器:

std::set<int> sSet;
    std::set<int>::iterator it;
    std::reverse_iterator<std::set<int>::iterator> itR;

sSet.insert(1);
sSet.insert(2);
sSet.insert(3);
sSet.insert(4);
sSet.insert(5);
sSet.insert(6);

for (it=sSet.begin(); it!=sSet.rend(); ++it)  //simple forward loop
{
  itR = std::reverse_iterator<std::set<int>::iterator>(it);
  for(;itR!=sSet.rbegin();++itR)
  {
    //Reverse iteration
    //for comparing every element to all the previous elements
    //Problem here is it goes up to the second element only and not first 
    //because of the condition itR!=sSet.begin()
  } 
}     

请注意,当反转迭代器时,反转版本不会指向范围内的相同元素,而是指向它之前的元素。这样,为了安排范围的过去元素:指向范围中的过去元素的迭代器,当被反转时,被更改为指向最后一个元素(不是通过它) )范围(如果反转,这将是范围的第一个元素)。如果一个范围中第一个元素的迭代器被反转,则反转的迭代器指向第一个元素之前的元素(如果反转,这将是范围的过去元素)。

答案 1 :(得分:0)

您可以使用内部while循环:

while (true)
{
    // do your comparison here

    if (itR == sSet.begin())
        break;

    --itR;
}