![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Fanat |
![]()
Сообщение
#1
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Как перегрузить opertor+ для итератора list<MyClass>::iterator?..
То есть хочу чтобы работал следующий код
list<ILXListItem>::iterator it;
it = it + 5;
Сделать перегрузку тривиально, но где это записать и как етим правильно пользоваться?.. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ну, ладно еще перегрузка операции для итератора, но почему list? У него же нет рандомного доступа... У vector-а есть... Вот смотри:
// Ну, перегрузка тривиальна - сам говоришь...
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;
}
}
Все-таки тебе либо не нужен list (точнее, нужен НЕ list), либо не надо перегружать подобным образом его итератор... |
Fanat |
![]()
Сообщение
#3
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Мне нужно реализовать класс-обёртку для листа...и среди функций этого класса есть вставка элемента в задданое место и удаление элемента с заданного места...и это место задаётся индексом...а для этого мне кажется необходимо сдвинуть итератор на заданный индекс...Может я в чем то ошибаюсь?..или это можно сделать легче?..
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Тогда тебе проще будет сделать обычный
...
public:
void erase_element(int index) {
list<int>::iterator it = begin();
for(; index; --index) ++it;
erase(it);
}
...
(тестировалось на том же списке целых), не перегружая операторы сложения для итераторов... |
Fanat |
![]()
Сообщение
#5
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Тогда тебе проще будет сделать обычный ...
public:
void erase_element(int index) {
list<int>::iterator it = begin();
for(; index; --index) ++it;
erase(it);
}
...
(тестировалось на том же списке целых), не перегружая операторы сложения для итераторов...Ну да...я тоже подобное писал...но потом вспомнил что желательно выделять одинаковые куски кода...ведь сдвиг итератора понадобится не только в этой функции...ну да ладно вроде таких всего 2... Добавлено через 4 мин. Кстати при написании обёртки мой класс должен содержать внутри себя list?.. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
![]() Так лучше: 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);
}
// ...
};
? |
Fanat |
![]()
Сообщение
#7
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Мне кажется так лучше...
![]() ![]() (Значит класс должен наследоваться от list?.. |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
В принципе - да, ты же делаешь обертку, то есть сохраняешь функциональность List-а и добавляешь свое, значит твой новый класс является некоторым видом списка, так? Это реализуется наследованием...
|
Fanat |
![]()
Сообщение
#9
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
В принципе - да, ты же делаешь обертку, то есть сохраняешь функциональность List-а и добавляешь свое, значит твой новый класс является некоторым видом списка, так? Это реализуется наследованием... В задании даны функции вида добавить элемент в конец, очистить, и дан список операций над списком... наверно имеется ввиду всё таки не сохранять всю функциональность list...ведь это можно добиться и агрегированием мне кажется... И ещё
...
friend
TMyList::iterator& //А что означает здесь &?
operator + (TMyList::iterator &it, int index) {
for(; index; --index) ++it;
return it;
...
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата ведь это можно добиться и агрегированием мне кажется А какая разница, дан тебе список операций или нет? Ну, сделаешь ты агрегированием, и что изменится? Разве что запретишь обращаться извне к тому или иному методу... Ну, как знаешь - тебе виднее, задание у тебя все-таки ![]() Цитата // А что означает здесь &? То есть, что означает & внутри скобок у тебя вопроса не возникло, а снаружи - непонятно? На самом деле - в обоих местах это означает одно и то же, возвращается ссылка на итератор, а не сам итератор. |
Fanat |
![]()
Сообщение
#11
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
То есть, что означает & внутри скобок у тебя вопроса не возникло, а снаружи - непонятно? На самом деле - в обоих местах это означает одно и то же, возвращается ссылка на итератор, а не сам итератор. Ну снаружи достаточно сложно понять где класс а где тип возвращаемого значения...? Вот в этой конструкции
list<ILXListItem*>::iterator&
Добавлено через 3 мин. Ну снаружи достаточно сложно понять где класс а где тип возвращаемого значения...? Вот в этой конструкции
list<ILXListItem*>::iterator&
Всё понял...тут просто обьявляется дружественная функция...Спасибо... Сообщение отредактировано: Fanat - 23.01.2008 0:34 |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Не понял... Что сложного? Ссылка на итератор шаблонного класса list, хранящего указатели на ILXListItem... Вас что, не учили правилу "право-лево" для разбора сложных конструкций?
![]() |
Fanat |
![]()
Сообщение
#13
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 19:49 |