Я пишу вторую версию вставки в 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)
}
Ссылка на русскую документацию: 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. Если вручную написать - все будет работать.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?
у меня возникли некоторые проблемы с одной задачейВот краткое условие:
Ajax запрос выполняется на основном домене http://site-ru/ (локальный сервер), но не выполняется на поддомене http://subsite-ru/