Почему нет доступа к полям MyIterator?

195
08 января 2022, 05:30

Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:

std::map<char,int>::iterator it = mymap.begin();
  mymap.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

В этом примере из STL, мне не понятно,зачем они передают итератор и называют это эффективной вставкой. Итератор же и так будет пробегать значения , пока не наткнётся на нужную пару. Что в этом эффективного?

template<class T,class R>
class Map 
{

public:
    Map();
    ~Map();
    R& operator[](T index)
    {
        return tree.searchOperator(index);
    }
    class MyIterator : public iterator<bidirectional_iterator_tag, RBTNode<T, R>>
    {
        friend class Map;
        public:
        MyIterator(RBTNode<T, R> *it)
        {
            second = it->Element.second;
            first = it->Element.first;
            temp = it;
        }
        MyIterator()
        {
        }
        MyIterator& operator=(const MyIterator& it) 
        {
            first = it.first;
            second = it.second;
            temp = it.temp;
            return (*this);
        }
        MyIterator& operator*()
        {
            return (*this);
        }
        MyIterator(const MyIterator& source)
        {
            first = source.first;
            second = source.second;
            temp = source.temp;
            /*temp->left = source.temp->left;
            temp->right = source.temp->right;
            temp->parent = source.temp->parent;
            temp->Element.first = source.temp->Element.first;
            temp->Element.second = source.temp->Element.second;
            temp->color = source.temp->color;*/
        }
        MyIterator operator++(int) 
        {//Post ++
            int j = 0;
            if (temp->right != NULL)
            {
                temp = temp->right;
            }
            if (temp->parent != NULL)//если root
            {
                temp = temp->parent;
            }

            first = temp->Element.first;
            second = temp->Element.second;
            return *this;
        }
        MyIterator *operator->() 
        {
            // 
            return (this);
        }
    public:
        T first;
        R second;
    private:
        RBTNode<T, R>* temp;
    };
    MyIterator begin()
    {
        RBTNode<T, R>* pt = tree.f_begin();
        MyIterator temp(pt);
        return temp;
    }
    pair<MyIterator, bool> insert(const std::pair<T,R> tempo)// first insert function
    {
        std::pair<MyIterator, bool> returnable;
        if (!tree.search(tempo.first))// проверка на уникальность
        {
            //RBTNode<T, R> tempnode;
            tree.insert(tempo.first, tempo.second);
            MyIterator ret(tree.search(tempo.first));//конструктор,чтобы знать ноду
            returnable.first = ret;
            returnable.second = 1;
            return returnable;
        }
        else 
        {
            MyIterator ret(tree.search(tempo.first));//конструктор,чтобы знать ноду
            returnable.first = ret;
            returnable.second = 0;
            return returnable;
        }

        //return ret;
    }
    MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)//second insertation function
    {

    }
private:
      RBTree<T,R> tree;
    //RBTNode<T, R> tempnode;
};
template <class T,class R>
Map<T, R>::Map() {

}
template <class T, class R>
Map<T,R>::~Map()
{
}

Вот в этой функции мне почему-то не доступны поля it. Как сделать их доступными?

MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)//second insertation function
        {

              it-> // не работает, хоть и оператор -> перегружен
              it. // не работает доступ к полям(хотя бы public first и second)
        }
Answer 1

Ссылка на русскую документацию: https://ru.cppreference.com/w/cpp/container/map/insert

Смотрим 3-4 перегрузку

Сложность

3-4) Амортизированная константа, если вставка происходит в позицию прямо после хинта. Иначе — логарифмическая по размеру контейнера. (до C++11)

3-4) Амортизированная константа, если вставка происходит в позицию прямо перед хинтом. Иначе — логарифмическая по размеру контейнера.

Получается, что такое использование будет эффективно, если вы знаете куда будет вставлен элемент.

Теперь по поводу недоступности:

MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)
        {

              it-> // не работает, хоть и оператор -> перегружен
              it. // не работает доступ к полям(хотя бы public first и second)
        }

С чего вы взяли что нет доступа. Доступ есть и все должно работать. Предполагаю, что IntelliSense просто не "подсказывает" вам поля. Это происходит из-за шаблонности класса MyIterator. Если вручную написать - все будет работать.

READ ALSO
Башня || Олимпиада ACM-ICPC

Башня || Олимпиада ACM-ICPC

Есть вопрос к задаче по алгоритмическому программированию:

218
(C++) Самоудаление dll возможно?

(C++) Самоудаление dll возможно?

Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?

171
Олимпиадная задача // Путь белки

Олимпиадная задача // Путь белки

у меня возникли некоторые проблемы с одной задачейВот краткое условие:

102
Как сделать jquery ajax запрос на поддомене?

Как сделать jquery ajax запрос на поддомене?

Ajax запрос выполняется на основном домене http://site-ru/ (локальный сервер), но не выполняется на поддомене http://subsite-ru/

97