Перегрузка операторов для карт C ++ - PullRequest
2 голосов
/ 27 сентября 2008

Мне нужна помощь в понимании некоторых операторов перегрузки операторов C ++. Класс объявлен так:

template <class key_t, class ipdc_t>
class ipdc_map_template_t : public ipdc_lockable_t
{
    ...
    typedef map<key_t,
            ipdc_t*,
            less<key_t>> map_t;
    ...

Создатель класса создал итератор для внутренней структуры карты:

struct iterator : public map_t::iterator
{
    iterator() {}
    iterator(const map_t::iterator & it)
        : map_t::iterator(it) {}
    iterator(const iterator & it)
        : map_t::iterator(
            *static_cast<const map_t::iterator *>(&it)) {}
    operator key_t() {return ((this->operator*()).first);}           // I don't understand this.
    operator ipdc_t*() const {return ((this->operator*()).second);}  // or this.

};

And begin () и end () возвращают начало () и конец () карты:

iterator begin() {IT_ASSERT(is_owner()); return map.begin();}
iterator end() {return map.end();}

У меня вопрос: если у меня есть итератор, как мне использовать эти перегрузки, чтобы получить ключ и значение?

ipdc_map_template_t::iterator iter;
    for( iter = my_instance.begin();
             iter != my_instance.end();
         ++iter )
    {
        key_t my_key = ??????;
        ipdc_t *my_value = ??????;

    }

Ответы [ 3 ]

6 голосов
/ 27 сентября 2008

Это операторы typecast, поэтому вы можете сделать это:

{
    key_t   key = iter;
    ipdc_t *val = iter;
}

Или, поскольку ipdc_map_template::iterator является подклассом std::map::iterator, вы все равно можете использовать оригинальные средства доступа (которые я считаю более читабельными):

{
    key_t   key = (*iter).first;
    ipdc_t *val = (*iter).second;

    // or, equivalently
    key_t   key = iter->first;
    ipdc_t *val = iter->second;

}
2 голосов
/ 27 сентября 2008

operator key_t () и operator ipdc_t * () являются определениями приведений. Итак, с учетом итератора, определенного в классе, вы можете просто назначить свои переменные:

ipdc_map_template_t::iterator iter;
    for( iter = my_instance.begin();
         iter != my_instance.end();
         ++iter )
    {
            key_t my_key = iter;
            ipdc_t my_value = iter;
    }
2 голосов
/ 27 сентября 2008

Создатель класса переопределил операторы приведения. Поэтому, просто присвоив iter объекту правильного типа, он должен автоматически привести себя через методы к правильным значениям.

N.B. : тип значения сохраняется как указатель. Поэтому, когда вы извлекаете значение, вам нужно указать указатель на тип значения, который вы указали в интерфейсе карты.

 typedef ipdc_map_template_t<int,std::string>   MyMap;
 MyMap    mymap;

 for(MyMap::iterator iter = mymap.begin();
                     iter != mymap.end();
                     ++iter )
    {
            int          my_key   = iter;
            std::string* my_value = iter;

    }

Не уверен, что согласен с направлением, принятым здесь. Делает ли это код более читабельным? Я бы придерживался старомодной карты, итератор звучит более удобно. Определен ли этот контейнер в какой-то специализированной библиотеке, которая вам нужна, или было бы полезно взглянуть на контейнеры с указателем наддува?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...