Найти первое значение больше указанного пользователем значения из контейнера карты - PullRequest
4 голосов
/ 07 сентября 2011

У меня есть контейнер с картой. Как вернуть первое значение, большее, чем указанное пользователем значение поиска, используя find_if следующим образом:

std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ......

Большое спасибо!

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Вы уверены, что хотите выполнить линейный поиск любого элемента со значением, превышающим ваши критерии, через контейнер?

Вероятно, было бы лучше также сохранить отдельный индекс отсортированных значений, которые вы могли бы назвать upper_bound, выполняя их в логарифмическом времени, а не линейно по количеству элементов. Вместо этого посмотрите boost::multi_index.

3 голосов
/ 07 сентября 2011

С лямбда-выражением:

int n = MYVALUE;
auto it = std:: find_if(Mymap.begin(), Mymap.end(),
                        [n](const std::pair<std::string, int> & x) -> bool
                        { return x.second > n; }
                       );

(Если значение фиксировано, вы можете поместить его непосредственно в тело лямбда-выражения. Для C ++ 14 и более поздних версий лямбда-захват может быть [n = MYVALUE]не нужна отдельная внешняя переменная n.)

с предикатом:

struct Finder
{
  Finder(int n_) : n(n_) { }
  int n;
  bool operator()(const std::pair<std::string, int> & x) const
  {
    return x.second > n;
  }
};

auto it = std::find_if(Mymap.begin(), Mymap.end(), Finder(MYVALUE));
2 голосов
/ 07 сентября 2011

Для C ++ 03 вам нужно предоставить объект компаратора или иметь дело с некоторыми хитрыми привязками:

typedef map<string, int>::value_type Value;

struct Comp
{
    Comp(int v) : m_v(v) { }

    bool operator()(const Value& v) const
    {
        return v.second > m_v;
    }

    int m_v;
};

void f()
{
    map<string, int> Mymap;
    map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), Comp(42));
}
0 голосов
/ 07 сентября 2011

Книга B.Stroustrup может оказаться очень полезной, когда речь заходит о возможностях STL. И он предлагает этот код:

bool gt_42 (const pair <const string ,int>& r )
{
    return  r.second >42 ;
}
void f (map <string,int >& m )
{
    typedef map <string ,int >:: const_iterator MI ;
    MI i = find_if (m.begin (), m.end (), gt_42 );
    // ...
}

Из главы «Путешествие по стандартной библиотеке» (доступно в файле .pdf) из «Язык программирования C ++, специальное издание»

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