Контейнеры STL: итерация между двумя итераторами - PullRequest
1 голос
/ 28 января 2011

Я храню значения в std :: map

Я нахожу два значения в карте и хочу перебрать от первого до последнего элемента - однако оператор <= не реализован, поэтому я не могу сделать что-то вроде этого: </p>

    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 ]

2 голосов
/ 28 января 2011

Используйте != вместо <=, и он будет делать то, что вы хотите.

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 голос
/ 28 января 2011
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());
1 голос
/ 28 января 2011

Для std::map<>::iterator нет оператора <=, но использование != на end_iter должно делать в основном то же самое.Если вы хотите включить сам конечный итератор в итерацию, используйте что-то вроде цикла do для выполнения теста != в конце.

0 голосов
/ 28 января 2011

Если вы хотите включить конечный итератор в цикл, вы можете увеличить свой итератор конечного условия ++end_iter. После этого цикл с cit != end_iter делает то же самое, что вы собираетесь делать с cit <= end_iter перед увеличением.

0 голосов
/ 28 января 2011

Вы должны использовать оператор !=. Я считаю, что это потому, что std :: map не обязательно является смежным в памяти (так что оператор <= не будет иметь большого смысла, в то время как std::vector будет), хотя я могу ошибаться

0 голосов
/ 28 января 2011

Алгоритм 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.
       });
}

Может быть, что-то подобное? Я не дал ему проверку компиляции ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...