2011-01-28 92 views
1

我存储在STD值之间的迭代::地图STL容器:两个迭代器

我发现在地图上的两个值,我想通过第一之间迭代到最后一个项目 - 但是< =运算符不落实,所以我不能做somethimng这样的:

void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp) 
    { 
     DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp), end_iter = recs.lower_bound(endtstamp); 

     // Can't do this .... (<= not defined) 
     //for (DatedRecordsetConstIter cit = start_iter; cit <= end_iter; cit++) 

     /So have to resort to a hack like this: 
     for (DatedRecordsetConstIter cit = start_iter; cit != recs.end(); cit++) { 
      if ((*cit).first <= (*end_iter).first){ 
       //do something; 
      } 
      else 
       break; 
      } 
     } 
} 

有两个已知的迭代器之间迭代的一个更优雅的方式?

+0

您可以使用cit!=(end_iter + 1)。 – 2011-01-28 20:35:16

+1

这不适用于`std :: map :: iterator`;它没有定义“+”运算符。尽管假设'end_iter'不是`recs.end()`,但是使用'boost :: next`之类的东西(尽管如此,原始规范在这种情况下将是无效的)。 – 2011-01-28 20:37:46

+0

@Jeremiah Willcock:你说的对,但`++`操作符可以做'new_end_iter = end_iter ++`的技巧。 – 2011-01-28 21:05:26

回答

2

使用!=而不是<=它会做你想做的事情。

void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp) 
{ 
    DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp), 
          end_iter = recs.upper_bound(endtstamp); 

    for (DatedRecordsetConstIter cit = start_iter; cit != end_iter; ++cit) { 
    } 
} 
1

std::map<>::iterator没有<=运算符,但使用!=end_iter应该做基本相同的事情。如果您想在迭代中包含结束迭代器本身,请使用类似于do循环的方法在最后执行!=测试。

1
struct ManipulateMatchingPairs { 
    template<class K, class V> 
    void operator()(const std::pair<K,V>& p) const { 
     // do with p.second as you please here. 
    } 
}; 

// ... 
std::for_each(start_iter, end_iter, ManipulateMatchingPairs()); 
0

的STL for_each算法也将不包括在循环结束迭代器。尽管如此,你总是可以增加end_iter,然后使用for_each,这样它就会被包含在内。

void foobar(const DatedRecordset& recs, 
      const double startstamp, 
      const double endtstamp) 
{ 
    DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp); 
    DatedRecordsetConstIter end_iter = recs.lower_bound(endtstamp); 
    if(end_iter != recs.end()) 
     ++end_iter; 

    for_each(start_iter, end_iter, []() 
     { 
      //do something inside the lambda. 
     }); 
} 

这样的事情可能吗?我没有给它一个编译检查...

0

你必须使用!=运算符。我相信这是因为std :: map在内存中不一定是连续的(所以<=运算符没有太大意义,而std::vector会),但我可能是错误的,尽管

0

如果你想包含结束迭代器,你可以增加你的结束条件迭代器++end_iter。之后,与cit != end_iter循环的做法与您打算在增量之前使用cit <= end_iter的做法相同。