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

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

Войти
Регистрация
Восстановить пароль
 
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
#1

Есть-ли поиск по полю в STL? - C++

17.07.2010, 02:47. Просмотров 636. Ответов 3
Метки нет (Все метки)

Писал программу. Дана структура. Надо реализовать ввод/вывод/сортировку по зарплате и по имени/поиск по зарплате. Данные хранить в списке. Написал.
Программа
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
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
struct Employee
{
    std::string name;
    std::string surname;
    std::string employ;
    double salary;
    friend std::ostream& operator <<(std::ostream&os, Employee&Ob);
    friend std::istream& operator >>(std::istream&is, Employee&Ob);
};
std::ostream& operator <<(std::ostream&os, Employee&Ob)
{
    os<<"Name: "<< Ob.name <<'\n';
    os<<"Surname: "<< Ob.surname <<'\n';
    os<<"Employ: "<< Ob.employ <<'\n';
    os<<"Salary: "<< Ob.salary <<'\n';
    return os;
}
std::istream&operator >>(std::istream&is, Employee&Ob)
{
    std::cin.get();
    std::cout<<"Enter name: "; std::getline(is, Ob.name);
    std::cout<<"Enter surname: "; std::getline(is, Ob.surname);
    std::cout<<"Enter employ: "; std::getline(is, Ob.employ);
    std::cout<<"Enter salary: "; is>>Ob.salary;
    std::cout<<std::endl;
    return is;
}
bool Sort_by_surname(const Employee&Ob, const Employee&Ob1)
{
    return Ob.surname<Ob1.surname;
}
bool Sort_by_sal(const Employee&Ob, const Employee&Ob1)
{
    return Ob.salary<Ob1.salary;
}
int main()
{
    std::list<Employee> List;
    Employee*Arr;
    int n=0;
    std::cout<<"Enter num of elements of array\n";
    std::cin>>n;
    Arr=new Employee[n];
    for(int i=0;i<n;i++)
    {
        std::cout<<"Enter [ "<< i+1 <<" ] element of array\n";
        std::cin>>Arr[i];
        List.push_back(Arr[i]);
    }
    std::list<Employee>::iterator p=List.begin();
    std::cout<<"Base information: \n";
    while(p!=List.end())
    {
        std::cout<<*p<<'\n';
        p++;
    }
    List.sort(Sort_by_surname);
    p=List.begin();
    std::cout<<"After sort by surname: \n";
    while(p!=List.end())
    {
        std::cout<<*p<<'\n';
        p++;
    }
    List.sort(Sort_by_sal);
    p=List.begin();
    std::cout<<"After sort by salary: \n";
    while(p!=List.end())
    {
        std::cout<<*p<<'\n';
        p++;
    }
    double Sal=0;
    bool count=false;
    std::cout<<"Enter salary for search\n";
    std::cin>>Sal;
    for(int i=0;i<n;i++)
    {
        if(Arr[i].salary==Sal)
        {
            std::cout<<"People with salary "<<Sal<<": "<<'\n'<<'\n'<<Arr[i]<<'\n';
            count=true;
        }
    }
    if (count==false)
        std::cout<<"There is no peoples with such salary\n";
    delete[] Arr;
    return 0;
}


Есть только 1 вопрос. Обязательно ли делать так:
C++
1
2
3
for(int i=0;i<n;i++)
    {
        if(Arr[i].salary==Sal)
То есть искать по полю в массиве или все же можно средствами STL непосредственно через список? И если можно, то как? Книжки смотрел. Не нашел. Спасибо за ответ!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2010, 02:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть-ли поиск по полю в STL? (C++):

Поиск в STL - C++
Здравствуйте) Вот пытаюсь совершить поиск в контейнере вектор спомощью find. Написал функтор, ищу ну что-то наверное неправильно. Не...

Есть ли функция gcd(нод) в STL - C++
Есть ли функция gcd(нод) в STL. Если да, то в каком заголовочном файле P.S. Проблем с её написанием вручную не возникает, но всё-таки...

Есть ли подробное описание устройства stl? - C++
Не как пользоваться, а подробный разбор исходников.

stl сортировка,поиск - C++
Как правильно сортировать Multiset&lt;char&gt; A Queue&lt;char&gt; B Напишите плз для каждого по 2 сортировки За возростанием и за спаданием. ...

Поиск и сортировка list STL - C++
Здравствуйте формумчане. Такая проблема. Написал почти рабочий код, но столкнулся с 2-мя проблемами. Первая: не могу понять как...

List STL сортировка и поиск - C++
Ребят, прошу помощи. Перерыл весь инет, нашёл кучу ссылок, пытался сделать поиск и сортировку, ни чего не получается. Помогите пожалуйста,...

3
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
17.07.2010, 10:01 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Это явно работа для std::for_each.
К нему надо описать действие, выполняемое для каждого объекта. Поскольку в данном случае надо хранить состояние между вызовами, придётся описывать класс с оператором вызова функции.
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
class CheckSalary {   // Сравниватель-печатальщик для for_each
public:
    CheckSalary(double salary): s(salary), empty(true) {}   // Задаём значение при создании объекта
    ~CheckSalary() {if(empty) std::cout << "No people with such salary!";}   // Сообщение о ненайденных людях выведется автоматически при уничтожении объекта
    // Само сравнение
    void operator () (const Employee &e)  const  // в качестве e любезный for_each подставит нам каждый элемент контейнера
    {
        if(e.salary == s)
        {
            if(empty)   // Выводим заголовок только один раз
                std::cout<<"People with salary " << s <<": "<<'\n'<<'\n';   
            empty = false;   // Всё, хотя бы один уже попался
            std::cout << e.name << ' ' << e.surname << '\n';   // Выведем имя сотрудника в строчку
        }
    }
private:
    const double s;   // Значение, с которым сравниваем
    bool empty;        // Признак того, что найден хотя бы один человек
};
 
// Теперь, после этого всего, внутри main достаточно написать так:
// std::for_each(List.begin(), List.end(), CheckSalary(sal));
// и на печать либо выскочит полный список людей с заданным жалованьем, 
// либо сообщение, что таковых не найдено
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.07.2010, 13:32  [ТС] #3
Nick Alte, Спасибо большое! Тем не менее это несколько напряжно. Но лучше юзать это или все же просто через массив?
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
25.07.2010, 11:05 #4
Результат получается один и тот же. У второго варианта есть свои преимущества с точки зрения правильности стиля, первый более понятен начинающим. Впрочем, с введением лямбда-функций в новом стандарте С++ второй вариант станет намного лаконичнее (даже лаконичнее первого), так что можно и не стараться к нему привыкать, а ждать выхода компиляторов "новой волны".
0
25.07.2010, 11:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2010, 11:05
Привет! Вот еще темы с ответами:

STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 - C++
Привет. Пытаюсь написать консольную программку для поиска определителя матрицы и нахождения корней линейного уравнения. Делаю с помощью...

Нужно изучить библиотеку STL. Какая литература есть хорошая? - C++
Прочитал Самоучитель Шилдта, очень понравилась книжка, но STL он только заинтриговал и сказал учить самим :( Какую литературу...

Поиск по любому полю структуры - C++
Нужно сделать поиск по любому полю структуры(Имя, фамилия или дата рождения) Вот собственно код самой структуры: #include &lt;stdio.h&gt; ...

STL list<> помогите есть затруднение Совсем не пойму в чем дело!!! - C++
В общем дан файл словаря из которого нужно все слова перевести в список list запись вроде корректная и все ок))но на выходе в другом файле...


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

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

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