Вставка карты класса шаблона VS Не вставка карты шаблона - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь понять, почему функция std :: map.insert () ведет себя по-разному.

Пример класса шаблона std :: map insert function:

        #include <iostream>
        #include <map>
        #include <limits>

        template<class K, class V>
        class container
        {
        private:
        std::map<K,V> m_map;
        public:
        container(const V Val)
        {
        m_map.insert(m_map.begin(),std::make_pair(std::numeric_limits<K>::lowest(),Val));
        }
        const V operator[](const K key)
        {
        return (--m_map.lower_bound(key))->second;
        }
        };

        int main()
        {
        container<unsigned int, char> c('A');
        std::cout<<std::numeric_limits<unsigned int>::lowest()<<":"<<c[std::numeric_limits<unsigned int>::lowest()]<<"\n";
        std::cout<<"1:"<<c[1]<<"\n";
        std::cout<<"2:"<<c[2]<<"\n";
        std::cout<<"3:"<<c[3]<<"\n";
        std::cout<<"4:"<<c[4]<<"\n";
        std::cout<<"5:"<<c[5]<<"\n";
        std::cout<<std::numeric_limits<unsigned int>::max()<<":"<<c[std::numeric_limits<unsigned int>::max()]<<"\n";
        return 0;
        }

Вывод:

0:A
1:A
2:A
3:A
4:A
5:A
4294967295:A

Пример функции non-template std :: map insert:

            #include <iostream>
            #include <map>
            #include <limits>
            int main()
            {
            std::map<unsigned int, char> m_map;
            m_map.insert(m_map.begin(),std::make_pair(std::numeric_limits<unsigned int>::min(),'A'));
            std::cout<<std::numeric_limits<unsigned int>::min()<<":"<<m_map[std::numeric_limits<unsigned int>::min()]<<"\n";
            std::cout<<"1:"<<m_map[1]<<"\n";
            std::cout<<"2:"<<m_map[2]<<"\n";
            std::cout<<"3:"<<m_map[3]<<"\n";
            std::cout<<"4:"<<m_map[4]<<"\n";
            std::cout<<"5:"<<m_map[5]<<"\n";
            std::cout<<std::numeric_limits<unsigned int>::max()<<":"<<m_map[std::numeric_limits<unsigned int>::max()]<<"\n";
            return 0;
            }

Вывод:

0:A
1:
2:
3:
4:
5:
4294967295:

Вывод первого примера показывает, чтовсем индексам от 0 до> 4294967295 был присвоен символ «A».Во втором примере только символу нуля (0) был присвоен символ «A».

Теперь мой вопрос заключается в том, почему в первом примере функции вставки было назначено одинаковое значение всем клавишам в диапазоне, хотя я и сделалтолько одна вставка и вторая функция вставки примера вставлены точно в одно место, на которое я намекал.

...