Форум программистов, компьютерный форум CyberForum.ru

Решение задач без циклов, использую библиотеку algorithm - C++

Восстановить пароль Регистрация
 
Rostov61
Сообщений: n/a
08.12.2012, 20:26     Решение задач без циклов, использую библиотеку algorithm #1
Имеется список 40 студентов, изучающих математику, физику, биологию и химию, заданный в файле в виде строк
Фамилия предмет
Каждый предмет изучает около 20 студентов. Разработать структуры данных, позволяющих эффективно отвечать на запросы вида «Выдать всех студентов, изучающих биологию и химию, но не изучающих физику».

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
template <typename T, typename T1>
T1 copy (T first, T last, T1 first2)
{
    while (first != last)
    {
        *first2 = *first;
        ++ first;
        ++ first2;
    }
    return first2;
}
 
#include <iostream>
#include <iomanip>
#include <vector>
#include <list>
#include <set>
#include <locale.h>
#include <ctime>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <string>
#include <fstream>
#include <map>
#include "My.h"
 
using namespace std;
 
bool if_subject(string x)
{
    if ((x=="математика") || (x=="химия") || (x=="физика") || (x=="биология")) 
        return false;
}
 
struct subject {
    bool mathematics;
    bool physics;
    bool biology;
    bool chemistry; 
} ;
 
template <typename C>
class it_sum {
    C &c;
    subject stupid;
public:
        it_sum (C &cc): c(cc), sum(0) {}
        it_sum<C> &operator++() { return *this; }
        it_sum<C> &operator*() { return *this; }
        it_sum<C> &operator = ( typename C::value_type x) {stupid.biology=0; stupid.chemistry=0; stupid.mathematics=0; stupid.physics=0; c[x]=stupid; return *this; }       
};
 
template <typename C>
it_sum<C> iterator_sum (C &cc)
{
    return it_sum<C> (cc);
}
 
 
const char* infile = "input.txt";
 
int main()
{
    setlocale ( LC_ALL , "Russian" ) ;
    srand ( time ( 0 ) ) ;
    vector<string> buf;
    fstream file(infile, ios_base::in);
 
    if (!file)
    {
        cout << "Нет такого файла" << endl;
        return 0;
        
    }
    
        istream_iterator<string> f_it(file);
    istream_iterator<string> end_f;
    buf.resize(46);
        ::copy(f_it, end_f, buf.begin());
    ::copy ( buf.begin(), buf.end(), ostream_iterator<string> (cout, "  ")) ; 
    cout << endl << endl;
    stable_partition( buf.begin(), buf.end(), &subject);
    ::copy ( buf.begin(), buf.end(), ostream_iterator<string> (cout, "  ")) ;   
 
    set <string> name;
    map <set <string>, struct subject > data;
    vector<string>::iterator it = buf.begin();
    advance (it, buf.size()/2);
    ::copy(buf.begin(), it, iterator_sum(data));
 
    return 0;
}
Небольшая заготовка, которая читает инфу из файла в вектор, потом сортирует таким образом, чтоб шли фамилии, а потом предметы, дальше хочу map <set <string>, struct subject >, первое поле - фамилии, второе - предметы...
Пример входного файла:
Ав математика
Бу физика
Гу физика
До физика
Ма биология
Рек математика
Ур химия
Фе химия
Ха биология
Ше биология
Ма физика
Гу биология
Ре биология
Ко биология
Ко математика
Рек физика
Рек химия
Ко химия
Ре химия
Ре физика
Ве математика
Ку биология
Ст химия

Ещё один вопрос, как не задавая размер вектора вначале, читать данные из файла (т.е. если мы не знаем размер файла)
Буду благодарен за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2012, 20:26     Решение задач без циклов, использую библиотеку algorithm
Посмотрите здесь:

Решение лабораторных на С++ посредством циклов, одномерных и двумерных массивов C++
Решение задач с помощью циклов C++
Перевернуть число без помощи массивов циклов C++
Заполнение двумерного массива без вложенных циклов C++
Методом рекурсии вывести число слево на право. Не использую массивов циклов строк C++
сумма элементов массива без циклов C++
Вставка одного вектора в другой через один без циклов C++
C++ Вычислить сумму следующего ряда без вложенных циклов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 07:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru