STL容器:在两个迭代器之间迭代

时间:2011-01-28 20:22:11

标签: c++ stl iterator

我将值存储在std :: map

我在地图中找到两个值,我想在第一个到最后一个项目之间进行迭代 - 但是< =运算符没有实现,所以我不能像这样做一些事情:

    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;
            }
       }
}

是否有更优雅的方法在两个已知的迭代器之间进行迭代?

6 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分: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());

答案 3 :(得分: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.
       });
}

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果要在循环中包含结束迭代器,可以递增结束条件迭代器++end_iter。在此之后,cit != end_iter的循环与您在增加之前与cit <= end_iter打算相同。