Как перегрузить opertor+ для итератора list<MyClass>::iterator?..
То есть хочу чтобы работал следующий код
list<ILXListItem>::iterator it;
it = it + 5;
Ну, ладно еще перегрузка операции для итератора, но почему list? У него же нет рандомного доступа... У vector-а есть... Вот смотри:
// Ну, перегрузка тривиальна - сам говоришь...Все-таки тебе либо не нужен list (точнее, нужен НЕ list), либо не надо перегружать подобным образом его итератор...
list<int>::iterator& operator += (list<int>::iterator &it, int value)
{
for(int i = 0; i < value; i++) ++it;
return it;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// Заполнили список для теста
list<int> myList;
for(int i = 0; i < 60; ++i) {
myList.push_back(i);
}
// А теперь - внимание: вот так сделать не получится !!!
// именно по причине отсутствия рандомного доступа
/*
for(list<int>::iterator it = myList.begin();
it < myList.end(); it += 5) {
// ...
}
*/
// вот __бредовый__ пример, показывающий, что перегрузка работает...
list<int>::iterator it = myList.begin();
for(int i = 0; i < 5; i++) {
Memo2->Lines->Add(IntToStr(*it));
it += 5;
}
}
Мне нужно реализовать класс-обёртку для листа...и среди функций этого класса есть вставка элемента в задданое место и удаление элемента с заданного места...и это место задаётся индексом...а для этого мне кажется необходимо сдвинуть итератор на заданный индекс...Может я в чем то ошибаюсь?..или это можно сделать легче?..
Тогда тебе проще будет сделать обычный
...(тестировалось на том же списке целых), не перегружая операторы сложения для итераторов...
public:
void erase_element(int index) {
list<int>::iterator it = begin();
for(; index; --index) ++it;
erase(it);
}
...
...(тестировалось на том же списке целых), не перегружая операторы сложения для итераторов...
public:
void erase_element(int index) {
list<int>::iterator it = begin();
for(; index; --index) ++it;
erase(it);
}
...
Так лучше:
class TMyList: public list<int>?
{
// ...
friend
TMyList::iterator&
operator + (TMyList::iterator &it, int index) {
for(; index; --index) ++it;
return it;
}
public:
void erase_element(int index) {
list<int>::iterator it = begin();
erase(it + index);
}
// ...
};
Мне кажется так лучше...
(Значит класс должен наследоваться от list?..
В принципе - да, ты же делаешь обертку, то есть сохраняешь функциональность List-а и добавляешь свое, значит твой новый класс является некоторым видом списка, так? Это реализуется наследованием...
...
friend
TMyList::iterator& //А что означает здесь &?
operator + (TMyList::iterator &it, int index) {
for(; index; --index) ++it;
return it;
...
list<ILXListItem*>::iterator&
list<ILXListItem*>::iterator&
Не понял... Что сложного? Ссылка на итератор шаблонного класса list, хранящего указатели на ILXListItem... Вас что, не учили правилу "право-лево" для разбора сложных конструкций?