Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
#1

std::map (заменить цикл на грамотный алгоритм) - C++

24.11.2012, 17:55. Просмотров 1574. Ответов 15
Метки нет (Все метки)

Привет!
Привожу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct Info
{
    Info() : magicNumber(0), age(0) {}
    Info(int magicNumber, int age) : magicNumber(magicNumber), age(age) {}
 
    int magicNumber;
    int age;
};
 
int main()
{
    srand ( time(NULL) );
 
    typedef std::map<int, Info> InfoMap;
    InfoMap infos;
    
    // in
    for (int i = 0; i < 5; ++i)
        infos[i] = Info(rand() % 2, rand() % 124);
    
    // out 
    for (int i = 0; i < 5; ++i)
        cout << i << ": " << infos[i].magicNumber << ", " << infos[i].age << endl;
 
 
    // magicNumber is 0?
    for (InfoMap::iterator it = infos.begin(); it != infos.end() ; ++it)
    {
        if(it->second.magicNumber != 0)
            break;
        if(it == (--infos.end()))
            cout << "magic number is 0!\n";
    }
    cin.get();
}
Нужно заменить цикл на грамотный STL алгоритм, который проверяет весь InfoMap(у всех ключей) на magicNumber = 0:
C++
1
2
3
4
5
6
7
    for (InfoMap::iterator it = infos.begin(); it != infos.end() ; ++it)
    {
        if(it->second.magicNumber != 0)
            break;
        if(it == (--infos.end()))
            cout << "magic number is 0!\n";
    }
можно ли?
p.s: C++ 03.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2012, 17:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::map (заменить цикл на грамотный алгоритм) (C++):

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? - C++
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования? - C++
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

Как заменить в файле строку, используя std::map? - C++
Как сделать так чтобы из файла записывались строки Можно было выбрать какую строку заменить на новую введенную с клавиатуры и записать все...

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

15
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
24.11.2012, 18:39 #2
вы таким циклом выходите, если у первого же элемента мапы magicNumber != 0

Anyway, а что нужно сделать, если нашли элемент с magicNumber == 0?

Добавлено через 1 минуту
и зачем вообще нужна std::map, если ключом является int? используйте std::vector
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 19:22  [ТС] #3
Цитата Сообщение от I.M. Посмотреть сообщение
вы таким циклом выходите, если у первого же элемента мапы magicNumber != 0

Anyway, а что нужно сделать, если нашли элемент с magicNumber == 0?

Добавлено через 1 минуту
и зачем вообще нужна std::map, если ключом является int? используйте std::vector
я предоставил пример, специально жирным шрифтом выделил.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
24.11.2012, 19:27 #4
Цитата Сообщение от I.M. Посмотреть сообщение
вы таким циклом выходите, если у первого же элемента мапы magicNumber != 0
Anyway, а что нужно сделать, если нашли элемент с magicNumber == 0?
Эти вопросы еще без ответа
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 19:50  [ТС] #5
Цитата Сообщение от I.M. Посмотреть сообщение
вы таким циклом выходите, если у первого же элемента мапы magicNumber != 0
Anyway, а что нужно сделать, если нашли элемент с magicNumber == 0?
Ничего. В этом и вся суть. Нужно проверить всё дерево на magicNumber == 0, а если даже хоть один элемент ключа будет magicNumber != 0, значит ничего не делаем и прерываем цикл.
Не ищите логики в программе, просто надо изменить грубый быдлокодерский цикл на грамотный алгоритм.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2012, 19:51 #6
std::for_each
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 19:56  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
ещё забыл добавить, нужно решить без создания предиката.

Добавлено через 1 минуту
Или функтора, забыл как это называется более точно
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2012, 19:57 #8
Цитата Сообщение от vechestva Посмотреть сообщение
Нужно проверить всё дерево на magicNumber == 0, а если даже хоть один элемент ключа будет magicNumber != 0, значит ничего не делаем и прерываем цикл.
std::find_if
Цитата Сообщение от vechestva Посмотреть сообщение
ещё забыл добавить, нужно решить без создания предиката.
никак
1
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 20:02  [ТС] #9
Ладно.
Сама реализация цикла мне кажется каким то нелепым. Jupiter и I.M., как бы вы его реализовали?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.11.2012, 20:32 #10
vechestva, std::for_each заменит ваш for. Уточните, что вы хотите иметь на выходе?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
24.11.2012, 20:37 #11
vechestva, если вы принципиально не хотите видеть функторы, то оформите цикл в виде метода, который возвращает bool
тогда кусок цикла надо переписать так:
C++
1
2
3
4
        if(it->second.magicNumber != 0)
            return false;
}
return true;
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 22:20  [ТС] #12
всем спасибо. Всё таки оставлю свой вариант.
Писать отдельную функцию для такого маленького дела, который будет использоваться только в одном месте - не круто.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.11.2012, 22:35 #13
vechestva, а лямбда?
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
24.11.2012, 22:48  [ТС] #14
Цитата Сообщение от go Посмотреть сообщение
vechestva, а лямбда?
Цитата Сообщение от vechestva Посмотреть сообщение
p.s: C++ 03.
Не читаем маленькие строчки внизу?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2012, 02:10 #15
vechestva, не кажется ли вам, что вы слишком круты для данного форума, тут одни старперы, решающие все через функторы, предикаты, for_each конструкции, лямбда, да еще и не умеющие читать и не понимающие вашей важной царской сущности и требований?
0
25.11.2012, 02:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 02:10
Привет! Вот еще темы с ответами:

Алгоритм std::find_end - аналог std::search_n - C++
Есть два семейства стандартных алгоритмов: std::search и std::find_end. Первое семейство предназначено для поиска первого совпадения...

std::map не компилируется - C++
Всем здравствуйте. Возникла проблема при попытке использования std::map в visual studio 2010. при подключении файла &lt;map&gt; и объявлении...

Особенности std::map - C++
Добрый день форумчане, хотел спросить такую вещь, сейчас занимаюсь оптимизацией в графическом движке и возникла такая проблемма, хочу...

переписать std::map - C++
Добрый вечер! Есть работающая программа, в которой используется map, все работало хорошо, но теперь немного изменились условия и объем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru