Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Требования к классам, используемых с итераторами, итераторы, контейнеры, STL 
:(
    Опции темы
Killerman
Дата 30.6.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



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

к пример:
Код


class MyClass
{
int a;
string b;
MyClass(int a1,string b1 ){ a = a1; b = b1}

};


typedef std::vector<MyClass> vectorOfMyclass;
vectorOfMyclass  vec1;

vec1.push_back(7,"aaa");
vec1.push_back(8,"bbb");

vec1::const_iterator iter1;
iter1==vec1.begin();   //здесь будет ошибка "vector iterators incompatible"


Я так понимаю в MyClass нужно перегрузить функцию operator== ? 
Хотелось бы знать точно, какие функции нужно перегрузить в классе MyClass.
Ведь еще нужно использовать iter1++,  iter1!=   и т.д.

PM MAIL   Вверх
Alexeis
Дата 30.6.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Killerman @  30.6.2009,  09:31 Найти цитируемый пост)
Я так понимаю в MyClass нужно перегрузить функцию operator== ? 
Хотелось бы знать точно, какие функции нужно перегрузить в классе MyClass.
Ведь еще нужно использовать iter1++,  iter1!=   и т.д.

  На самом деле перегрузки всех операторов не нужно, чаще всего нужна перегрузка оператора присваивания и нужен конструктор копирования, остальные операторы зависят от того что используется и от типа контейнера. Например для map-а нужен оператор < либо класс функтор реализующий такое сравнение. Разные алгоритмы могут потребовать разных операторов, имеет смысл их вводить по мере надобности. 
  Кстати мне кажется тут иная ошибка, потому что сравниваются не классы, а итераторы, т.е. указатели.
Попробуйте заменить
vec1::const_iterator iter1;
на
vec1::iterator iter1;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Fazil6
Дата 30.6.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Killerman @  30.6.2009,  10:31 Найти цитируемый пост)
Тоесть может быть, какие функции нужно определить в своем классе, чтобы работая с контейнерами, не вылетала ошибка.

класс должен реализовывать семантику копирования. 
Вобщем это все, что нужно. 
PM MAIL   Вверх
Alexeis
Дата 30.6.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Ой даже не так, итератор следует объявлять так.
Код

vectorOfMyclass::const_iterator iter1;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 30.6.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Killerman @  30.6.2009,  10:31 Найти цитируемый пост)
vec1::const_iterator iter1;
iter1==vec1.begin();   //здесь будет ошибка "vector iterators incompatible"

нужно инициализировать итераторы, если ты не инициализировал его ничем, то сработает assert, если хочешь, что-бы итератор никуда не указывал, присвой ему vec1.end();

Код

vectorOfMyclass::const_iterator iter1 = vec1.end();
iter1==vec1.begin(); 


Добавлено через 1 минуту и 59 секунд
вообще, в vs assert сработает (в случае, если отладка итераторов включена), если итераторы указывают на элементы разных контейнеров
PM MAIL Skype GTalk   Вверх
Killerman
Дата 30.6.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Ясно. спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.