Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2012, 04:00   #1
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию STL. Поиск в multiset.

Нужно найти всех людей с определённой фамилией, как это можно сделать?
Код:
class person
   {
   private:
      string lastName;
      string firstName;
      long phoneNumber;
   public:                         // конструктор по умолчанию
      person() : lastName("пусто"),
                 firstName("пусто"), phoneNumber(0)
         {  }
                                   // конструктор с тремя параметрами
      person(string lana, string fina, long pho) :
              lastName(lana), firstName(fina), phoneNumber(pho)
         {  }
      friend bool operator<(const person&, const person&);
      friend bool operator==(const person&, const person&);

      void display() const         // вывод данных о людях
         {
         cout << endl << lastName << ",\t" << firstName
              << "\t\tТелефон: " << phoneNumber;
         }
   };
                                   // оператор < для класса person
bool operator<(const person& p1, const person& p2)
   {
   if(p1.lastName == p2.lastName)
      return (p1.firstName < p2.firstName) ? true : false;
   return (p1.lastName < p2.lastName) ? true : false;
   }
                                   // оператор == для класса person
bool operator==(const person& p1, const person& p2)
   {
   return (p1.lastName == p2.lastName &&
           p1.firstName == p2.firstName ) ? true : false;
   }
///////////////////////////////////////////////////////////
int main()
   {                               // создание объектов person
   person pers1("Deauville", "William", 8435150);
   person pers2("McDonald", "Stacey", 3327563);
   person pers3("Bartoski", "Peter", 6946473);
   person pers4("KuangThu", "Bruce", 4157300);
   person pers5("Wellington", "John", 9207404);
   person pers6("McDonald", "Amanda", 8435150);
   person pers7("Fredericks", "Roger", 7049982);
   person pers8("McDonald", "Stacey", 7764987);
                                   // мультимножество класса person
   multiset< person, less<person> > persSet;
                                   // итератор этого мультимножества
   multiset<person, less<person> >::iterator iter;

   persSet.insert(pers1);          // занести объекты person в
                                   //мультимножество
   persSet.insert(pers2);
   persSet.insert(pers3);
   persSet.insert(pers4);
   persSet.insert(pers5);
   persSet.insert(pers6);
   persSet.insert(pers7);
   persSet.insert(pers8);

   cout << "\nЧисло записей: " << persSet.size();

   iter = persSet.begin();         //Вывод содержимого
                                   //  мультимножества
   while( iter != persSet.end() )
      (*iter++).display();
                                   // получение имени и фамилии
   string searchLastName;
   cout << "\n\nВведите фамилию искомого человека: ";
   cin >> searchLastName;
        // создание объекта с заданными значениями атрибутов
   person searchPerson(searchLastName, " ", 0);
        // сосчитать количество людей с таким именем
   int cntPersons = persSet.count(searchPerson);
   cout << "Число людей с таким именем: " << cntPersons;
   return 0;
}
Дебаг показал, что выполнение operator== не происходит в принципе. Не понимаю как можно сделать поиск по фамилии . Отказываться от multiset не хочется, т.к. скорость поиска играет решающую роль.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 24.06.2012, 04:09   #2
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Как всегда решение пришло сразу после поста на форум. Вот так:
Код:
bool operator<(const person& p1, const person& p2)
   {
   return (p1.lastName < p2.lastName) ? true : false;
   }
всё работает. Тогда задам другой вопрос, с Вашего позволения =) Можно ли в рамках одного мультисета реализовать поиск по имени или/и фамилии, или затраты на сортировку съедят весь выигрыш в скорости поиска?
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 24.06.2012, 04:50   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

multiset использует operator< как для сортировки, так и для проверки на равенство двух элементов, поэтому operator== не вызывался.
Сортировка происходит немедленно, при вставке элемента, о каких именно затратах Вы говорите?
И кстати, операторы <, ==, >, <=, etc... возвращает значение типа bool, не нужно ещё условный оператор использовать.
Код:
bool operator< (const person &p1, const person &p2)
{ return p1.lastName < p2.lastName; }
netrino вне форума Ответить с цитированием
Старый 25.06.2012, 09:55   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Нужен более показательный пример. Допустим есть класс employer. Пусть он имеет поля name, lastname, patronic(отчество). Необходимо добавить большое число экземпляров класса в память таким образом, чтобы поиск происходил максимально быстро. При этом поиск может идти с указанием как всех трёх полей, так и одного/двух.
При добавлении экземпляров в дерево первичным ключом является фамилия. Насколько я понимаю, перестроить дерево так, чтобы ключом являлось имя(для поиска по имени) невозможно.
У меня есть идея - создать multimap и добавить туда все записи по три раза, так чтобы поиск можно было произвести по любой из сущностей.
Есть ещё одна идея. Плюнуть множества/отображения и сделать всё списком, но тогда теряется так нужная мне скорость поиска.
Можно ли сделать нужный мне поиск по множеству/отображению или лепить список?
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 25.06.2012, 10:03   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Last

При этом поиск может идти с указанием как всех трёх полей, так и одного/двух.

Стандартные контейнеры не поддерживают поиск по нескольким ключам.

Можно ли сделать нужный мне поиск по множеству/отображению или лепить список?

изобретать свой контейнер или взять Boost.MultiIndex
Rififi вне форума Ответить с цитированием
Старый 25.06.2012, 10:47   #6
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
взять Boost.MultiIndex
Спасибо, эта штука должна меня спасти =)
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 25.06.2012, 13:22   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Last

Спасибо, эта штука должна меня спасти =)

Многих уже спасла (:
Примеры есть даже на этом форуме, в том числе и с комбинированным индексом (как раз твой случай)
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с STL. Поиск эйлерова цикла на графе litviak Общие вопросы C/C++ 2 14.04.2012 10:45
Контейнер multiset applegrub Общие вопросы C/C++ 9 14.03.2012 02:41
Поиск в векторе stl Blad47 Помощь студентам 8 15.04.2011 15:14
stl,Поиск Определителя матриц и решение линейных уравнений. igsxor Общие вопросы C/C++ 0 19.03.2011 21:52
Сортировка multiset m9yt Общие вопросы C/C++ 5 11.05.2010 00:48