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

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

Восстановить пароль Регистрация
 
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.07.2010, 02:47     Есть-ли поиск по полю в STL? #1
Писал программу. Дана структура. Надо реализовать ввод/вывод/сортировку по зарплате и по имени/поиск по зарплате. Данные хранить в списке. Написал.
Программа
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 непосредственно через список? И если можно, то как? Книжки смотрел. Не нашел. Спасибо за ответ!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2010, 02:47     Есть-ли поиск по полю в STL?
Посмотрите здесь:

C++ Поиск данных в файле по ключевому полю
Поиск по любому полю структуры C++
STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 C++
Поиск в STL C++
C++ stl сортировка,поиск
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.07.2010, 10:01     Есть-ли поиск по полю в STL? #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));
// и на печать либо выскочит полный список людей с заданным жалованьем, 
// либо сообщение, что таковых не найдено
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.07.2010, 13:32  [ТС]     Есть-ли поиск по полю в STL? #3
Nick Alte, Спасибо большое! Тем не менее это несколько напряжно. Но лучше юзать это или все же просто через массив?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
25.07.2010, 11:05     Есть-ли поиск по полю в STL? #4
Результат получается один и тот же. У второго варианта есть свои преимущества с точки зрения правильности стиля, первый более понятен начинающим. Впрочем, с введением лямбда-функций в новом стандарте С++ второй вариант станет намного лаконичнее (даже лаконичнее первого), так что можно и не стараться к нему привыкать, а ждать выхода компиляторов "новой волны".
Yandex
Объявления
25.07.2010, 11:05     Есть-ли поиск по полю в STL?
Ответ Создать тему
Опции темы

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