На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Использование map, Как использовать структуру как ключ?
    struct asd1{
    int a;
    int b;
    };
    struct asd2{
    int c;
    int d;
    };

    typedef pair <asd1, asd2> asd1asd2;
    map <asd1, asd2> m1;
    map <asd1, asd2> :: iterator pIter;

    Как занести в map данные?
      map[key]=value;
        Все просто. Простейший пример - тебе нужно сделать записную книжку. Там у тебя с каждой фамилией ассоциируется некоторая структура данных, содержащая телефон, адрес и т. п. информацию. Так вот - фамилия - это ключ, а структура - значение:
        CODE

        #include <map>
        #include <string>

        struct Person
        {
        std::string FirstName;
        std::string LastName;
        std::string PhoneNumber;
        std::string EMail;
        std::string Address;
        };

        std::map<std::string, Person> AddressBook;

        int main(int argc, char** argv)
        {
        // Помещаем что-то в книгу:
        Person p = {"Иван", "Иванов", "1234567", "", ""};
        Person p2 = {"Петр", "Пертов", "987654", "", ""};

        AddressBook[p.LastName] = p;
        AddressBook[p2.LastName] = p2;

        // Извлекаем:
        Person& p3 = AddressBook["Иванов"];
        Person& p4 = AddressBook["Петров"];
        }
        "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
        Морган Фриман
        Реализация шаблонов Jinja2 для C++ Jinja2 C++
          Спасибо, но мне это было понятно. Мне интересно как организовать сложный ключ.
          map[key]=value, если key типа
          struct asd1
          {
          int a;
          int b;
          };
          не работает
            Мне нужен ключ, содержащий 2 inta. На данный момент я просто сделал вложенный map.

            struct EventInfo
            {
            char EventName[255];
            char EventInstruction[1024];
            unsigned int SymbolID;
            unsigned char EventGroupID;
            bool NeedFixedZone;
            };
            typedef map <int, EventInfo> EventsInfoMap;

            EventsInfoMap EventsInfoTemp;
            EventsInfoMap::iterator EventsInfoTempIterator;
            typedef pair <int, EventInfo> ObjectEventsInfoPair;

            map <int, EventsInfoMap> Objects_Events;
            map <int, EventsInfoMap>::iterator Objects_EventsIterator;
            typedef pair <int, EventsInfoMap> Objects_EventsPair;
              В этом случае для сложного ключа необходимо реализовать операцию less. Например, так:
              CODE

              bool less(const asd1& a1, const asd2& a2)
              {
              return a1.a < a2.a && a1.b < a2.b;
              }
              Сообщение отредактировано: Flex_Ferrum -
              "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
              Морган Фриман
              Реализация шаблонов Jinja2 для C++ Jinja2 C++
                И еще как я понял из того, что вы написали pair это лажа, можно без него заносить?
                  Спасибо за less огромное.
                    QUOTE (Гость Raven @ 17.11.03, 11:26)
                    И еще как я понял из того, что вы написали pair это лажа, можно без него заносить?

                    Можно и без него. Но тот пример, который привел я, простейший. В личной практике я чаще использую такой вариант:
                    CODE

                    some_map.insert(make_pair(key, value));

                    При таком способе вставки можно узнать - было ли уже значение с таким ключем в коллекции:
                    CODE

                    bool inserted = some_map.insert(make_pair(key, value)).second;


                    Поэтому утверждать, что пара - это "лажа" нельзя.
                    "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                    Морган Фриман
                    Реализация шаблонов Jinja2 для C++ Jinja2 C++
                      CODE

                      bool less(const asd1& a1, const asd2& a2)
                      {
                      return a1.a < a2.a && a1.b < a2.b;
                      }

                      Мне такая возможность не нужна (ключи будут уникальные), но все равно интересно было узнать.
                      Спасибо.
                        Дело в другом. map упорядочивает хранимые значения по ключу (для оптимизации доступа к ним). Ключи считаются уникальными априори. По этому less нужна обязательно. Альтернативный вариант - использование hash_map. Там действительно нужна только операция равенства (equal). Но этот контейнер идет только в поставке STLPort'а.
                        "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                        Морган Фриман
                        Реализация шаблонов Jinja2 для C++ Jinja2 C++
                          class asd3
                          {
                          public:
                          bool less(const asd1& a1, const asd1& a2)
                          {
                          return a1.a < a2.a && a1.b < a2.b;
                          }
                          };
                          map <asd1, asd2, asd3 > m1;
                          asd1 f;
                          asd2 h;
                          m1[f]=h;
                          Что-то не работаетsad.gif
                            less должна быть глобальной функцией.
                            "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                            Морган Фриман
                            Реализация шаблонов Jinja2 для C++ Jinja2 C++
                              bool less(const asd1& a1, const asd1& a2)
                              {
                              return a1.a < a2.a && a1.b < a2.b;
                              }
                              map <asd1, asd2, less > m1;
                              asd1 f;
                              asd2 h;
                              m1[f]=h;
                              Тоже не работает
                              И так пробовал map <asd1, asd2, less<asd1> > m1;
                                Извини, запутал я тебя. Вмето less тебе нужно определить оператор '<':
                                CODE

                                bool operator <(const asd1& a1, const asd1& a2)
                                {
                                return a1.a < a2.a && a1.b < a2.b;
                                }

                                Ты его можешь определить и в виде внешней функции, и в виде member-function.
                                "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                                Морган Фриман
                                Реализация шаблонов Jinja2 для C++ Jinja2 C++
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1197 ]   [ 18 queries used ]   [ Generated: 23.09.19, 09:52 GMT ]