Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL: поиск элемента в мапе. переписать с юзаньем STL 
:(
    Опции темы
varnie
Дата 7.7.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



hell-o~
имеется std::map< std::size_t, int >. нужно найти ключ, который имеет наименьшее value в этом мапе, но не равное минус единице (-1).
написать написал, но хочется переписать с использованием STL/Boost. подскажите, как, пожалуйста.
мой код:
Код

  std::map< std::size_t, int > test;

  //populate test

  //find a winner
  std::size_t winnerIndex = test.begin()->first;
  for (std::map< std::size_t, int>::const_iterator iter = test.begin(); iter != test.end(); ++iter) {               
       if (iter->second != -1 && iter->second < test[winnerIndex]) {
                       winnerIndex = iter->first;
       }
  }
                            
  if (test[winnerIndex] != -1) {
     //do smth useful
  }


Это сообщение отредактировал(а) varnie - 7.7.2008, 17:06
PM MAIL   Вверх
Alek86
Дата 7.7.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



мой код:
Код
#include <map>
#include <iostream>
#include <algorithm>

typedef std::map< std::size_t, int > MyMap;

bool Compare(const MyMap::value_type& lhs, const MyMap::value_type& rhs) {
  if (-1 == lhs.second) return false;
  return lhs.second < rhs.second;
}

int main() {
  MyMap test;
  test[1] = 2320;
  test[2] = 5;
  test[3] = 10;
  test[4] = 20;
  test[5] = -1;
  test[6] = 20;
  test[7] = 30;
  MyMap::const_iterator min_el = std::min_element(test.begin(), test.end(), &Compare);
  if (test.end() == min_el)
    std::cout << "Min val not found" << std::endl;
  else
    std::cout << "Min val == " << min_el->second << std::endl;
}


если что, спрашивай

Добавлено через 6 минут и 22 секунды
кстати, у тебя нет проверки на пустоту мапы

Это сообщение отредактировал(а) Alek86 - 7.7.2008, 17:14


--------------------
user posted image    user posted image
PM MAIL   Вверх
varnie
Дата 7.7.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



спасибо, предложенный вами вариант подходит.
а проверка на пустоту мапы у меня уже есть в моем алгоритме, а этот кусок кода отрабатывает далее лишь в случае непустой мапы.
PM MAIL   Вверх
T0ohtik
Дата 7.7.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Лучше использую метод класса empty, для проверки на пустоту карты.
PM MAIL   Вверх
varnie
Дата 7.7.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



T0ohtik, я так и делаю. использую map::empty().
выше постом я хотел сказать что сначала я через метод emtpy() у std::map проверяю данные на непустоту, и если это так, то далее у меня следует вся вереница кода, расписанная в моем первом посте. все в порядке. 
PM MAIL   Вверх
Rififi
Дата 7.7.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



... но хочется переписать с использованием STL/Boost ...
Монстрим в стиле Boost.Lambda smile 

Переделанный код by Alek86, 

Код
#include <map>
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

int main()
{
    namespace lm = boost::lambda;
    typedef std::map<std::size_t, int> MyMap;
    
    MyMap test;
    test[1] = 2320;
    test[2] = 5;
    test[3] = 10;
    test[4] = 20;
    test[5] = -1;
    test[6] = 20;
    test[7] = 30;

    typedef lm::lambda_functor<
        lm::lambda_functor_base<
            lm::action<2, lm::function_action<2,lm::detail::unspecified> >,
            boost::tuples::tuple<
                int std::pair<unsigned int const ,int>::* const, lm::lambda_functor<lm::placeholder<1> > const
                > > > arg1_t;
    arg1_t arg1 = lm::bind(&MyMap::value_type::second, lm::_1);

    typedef lm::lambda_functor<
        lm::lambda_functor_base<
            lm::action<2, lm::function_action<2,lm::detail::unspecified> >,
            boost::tuples::tuple<
                int std::pair<unsigned int const ,int>::* const, lm::lambda_functor<lm::placeholder<2> > const
                > > > arg2_t;
    arg2_t arg2 = lm::bind(&MyMap::value_type::second, lm::_2);

    MyMap::const_iterator it = std::min_element(test.begin(), test.end(), arg1 != -1 && arg1 < arg2);

    // ...

    return 0;
}


Это сообщение отредактировал(а) Rififi - 7.7.2008, 21:02
PM MAIL   Вверх
bsa
Дата 7.7.2008, 21:02 (ссылка) |   (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Rififi
"мама, роди меня обратно"
PM   Вверх
Rififi
Дата 7.7.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



bsa, 
null_types на самом деле не нужны, поэтому малость подсократил :green:

PM MAIL   Вверх
Любитель
Дата 8.7.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Rififi @  7.7.2008,  20:59 Найти цитируемый пост)
    MyMap test;
    test[1] = 2320;
    test[2] = 5;
    test[3] = 10;
    test[4] = 20;
    test[5] = -1;
    test[6] = 20;
    test[7] = 30;

Ну кто так пишет?! Тогда уж boost::assign...

Цитата(Rififi @  7.7.2008,  20:59 Найти цитируемый пост)
    typedef lm::lambda_functor<
        lm::lambda_functor_base<
            lm::action<2, lm::function_action<2,lm::detail::unspecified> >,
            boost::tuples::tuple<
                int std::pair<unsigned int const ,int>::* const, lm::lambda_functor<lm::placeholder<2> > const
                > > > arg2_t;

smile

Добавлено через 3 минуты и 18 секунд
Не проще просто:
Код

MyMap::const_iterator it = std::min_element(test.begin(), test.end(),
                                                                       lm::bind(&MyMap::value_type::second, lm::_1) != -1 &&
                                                                       lm::bind(&MyMap::value_type::second, lm::_1)< lm::bind(&MyMap::value_type::second, lm::_2));

А? Ну или ждать, когда появится type inference (auto-типы).

Добавлено через 3 минуты и 45 секунд
Пробелы, как-то не тем шрифтом пошли smile 


--------------------
PM MAIL ICQ Skype   Вверх
anatox91
Дата 8.7.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



Цитата(Rififi @  7.7.2008,  20:59 Найти цитируемый пост)
    typedef lm::lambda_functor<
        lm::lambda_functor_base<
            lm::action<2, lm::function_action<2,lm::detail::unspecified> >,
            boost::tuples::tuple<
                int std::pair<unsigned int const ,int>::* const, lm::lambda_functor<lm::placeholder<1> > const
                > > > arg1_t;
    arg1_t arg1 = lm::bind(&MyMap::value_type::second, lm::_1);

как говорится, write-only  smile 

Это сообщение отредактировал(а) anatox91 - 8.7.2008, 14:39


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
varnie
Дата 12.8.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



Alek86, 
ваш пример в посте #2 этой темы неверный.
если у нас в в мапе будет один единственный элемент у которого value будет -1, то
Код

 MyMap::const_iterator min_el = std::min_element(test.begin(), test.end(), &Compare);
   if (test.end() == min_el)
            std::cout << "Min val not found" << std::endl;
      else
            std::cout << "Min val == " << min_el->second << std::endl;

выведет "Min val == -1", что противоречит условию моей задачи. см пост #1.

ps: да и примеры остальных ответивших тоже не учитывают это --> могут выдать неверный результат.
нужно дополнительно встроить проверку.

Это сообщение отредактировал(а) varnie - 12.8.2008, 18:04
PM MAIL   Вверх
Alek86
Дата 12.8.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ну так встрой


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2189 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.